ElasticSearch NEST - 如何在搜索中确定字段的优先级

时间:2015-08-05 15:06:17

标签: elasticsearch nest

我需要在文档中的三个字段中搜索一个术语,并根据searchTerm的找到位置对结果进行排序。 因此,例如,找到3个文件: 1在field2中搜索词, 2在field3中搜索词, 3,在field1中搜索词。

我希望按顺序看到它们:3,1,2。

我以为我可以使用助推器来做到这一点。 现在我使用以下方法:

var results = ES.Search<SearchData>(s => 
         s.TrackScores()
           .Query(q =>
                  q.Range(v => v.OnField(x => x.ExpirationDate).GreaterOrEquals(DateTime.Today)) &&
                  q.MultiMatch(m => 
                               m.OnFieldsWithBoost(b =>
                                                   b.Add(d => d.Field1, 3)
                                                    .Add(d => d.Field2, 2)
                                                    .Add(d => d.Field3, 1))
                                .Operator(Operator.And)
                                .Query(term)))
                    .Sort(doc => doc.OnField("_score").Descending())
                    .SortDescending(doc => doc.Date));

但是,如果我有一个文档,其中4个单词等于field2中的搜索词,而另一个文档则带有1个单词,则后者的得分会更小。

有人可以告诉我在查询中应该更改的内容,以便无论field2和field3中有多少匹配,field1中的匹配得分都更高(并且字段2中的匹配得分高于field3中任意数量的匹配) ?

我看到的一个解决方案是为field1和field2设置更大的值:

b.Add(d => d.Field1,1000)     
 .Add(d => d.Field2, 100)

但它并不理想,所以我真的希望你有一个更好的。

1 个答案:

答案 0 :(得分:1)

我的最终解决方案是:

var results = ES.Search<SearchData>(
                s => s.TrackScores()
                    .Query(q => q.Range(v => v.OnField(x => x.ExpirationDate).GreaterOrEquals(DateTime.Today)) &&
                        (q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field1).Operator(Operator.And).Query(searchTerm))).Boost(1000))
                        || q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field2).Operator(Operator.And).Query(searchTerm))).Boost(10))
                        || q.ConstantScore(cs => cs.Query(qcs => qcs.MultiMatch(m => m.OnFields(b => b.Field3).Operator(Operator.And).Query(searchTerm))).Boost(1))))
                                        .Sort(doc => doc.OnField("_score").Descending())
                                        .SortDescending(doc => doc.Date));
相关问题