当辅助字段是特定值时,使用NEST提升弹性搜索结果

时间:2018-01-16 20:17:02

标签: c# elasticsearch nest

我有一个很大的冰淇淋对象索引。

public class IceCream
{
    public string Description {get; set;}
    public bool IsGeneric { get; set; }
    public double Price { get; set; }
}

我有一个大型产品数据库,用于制作冰淇淋奶昔。该业务主要使用通用白标产品,但由于供应链问题,有时可能被迫使用品牌产品。请参阅下面的示例数据以供参考。

  • Double Choc
  • Ben& Jerries Double Choc
  • Fairy Farms Double Choc
  • 丹的双巧克力

以下是基于C#Nest的查询的简化示例。

        var searchInputText = "Ben & Jerries double choc";

        var query = new MatchQuery()
        {
            IsVerbatim = false,
            Field = "description",
            Query = searchInputText
        };

        var search = new SearchRequest()
        {
            Query = query,
            From = 0,
            Size = 30
        };

        var results = client.Search<IceCream>(search);

在搜索品牌产品时,查询效果很好。但是,搜索“Double Choc”会让Ben&amp; Jerries Double Choc具有比通用“Double Choc”产品更高的相关性。

有没有办法通过Nest利用“应该”来提升IsGeneric = true字段,以确保在搜索中没有品牌时,通用列表具有最高的相关性?

即。寻找“Double Choc”的人会期待......

  1. Double Choc
  2. Ben&amp; Jerries Double Choc
  3. 寻找“Ben&amp; Jerries Double Choc”,人们会期待......

    1. Ben&amp; Jerries Double Choc
    2. Dan's Double Choc
    3. 注意:这是一个非常简化的示例。真实世界的应用程序包含100,000个制造组件差异,因此相关性问题远比此处显示的要大得多。

1 个答案:

答案 0 :(得分:1)

是的,您可以使用Boosting查询。

client.Search<IceCream>(s => 
    s.Query(q => 
        q.Boosting(b => 
            b.Negative(n => n.Term("isGeneric", false))
             .Positive(p => p.Match(m => m.Field("description").Query(searchInputText)))
             .NegativeBoost(0.2))));

通过提升IsGeneric = false的负增强为0.2,您可以将IsGeneric = true的所有结果降级为常数值。