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

ElasticSearch NEST - how to prioritise fields in the search

我只需要在文档中的三个字段中搜索术语,并根据找到搜索术语的位置对结果进行排序。 因此,例如,找到 3 个文档: 1 在字段 2 中包含搜索词, 2 在字段 3 中使用搜索词, 3 在字段 1 中使用搜索词。

我想按顺序查看它们: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));

但是,如果我有一个文档在 field2 中有 4 个词等于搜索词,而另一个文档在 field1 中有 1 个词,那么后者的分数会更小。

有人可以告诉我应该在我的查询中更改什么,以便无论 field2 和 field3 中有多少匹配项,field1 中的匹配项都具有更高的分数(并且字段 2 中的匹配项比字段 3)?

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

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

但还不够理想,所以我真的希望你有更好的。

我最终的解决方案是:

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));