elasticsearch ElasticSearch NEST-如何对搜索中的字段进行优先级排序,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch ElasticSearch NEST-如何对搜索中的字段进行优先级排序,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch ElasticSearch NEST-如何对搜索中的字段进行优先级排序

elasticsearch ElasticSearch NEST-如何对搜索中的字段进行优先级排序,elasticsearch,nest,elasticsearch,Nest,我只需要在文档中的三个字段中搜索一个词,并根据搜索词的位置对结果进行排序。 例如,可以找到3个文档: 1字段中有搜索词2, 2,搜索词位于字段3中, 3,搜索词位于字段1中 我想看看他们的顺序:3,1,2 我想我可以用助推来做。 现在我使用以下方法: var results = ES.Search<SearchData>(s => s.TrackScores() .Query(q => q.Ra

我只需要在文档中的三个字段中搜索一个词,并根据搜索词的位置对结果进行排序。 例如,可以找到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));
但这并不理想,所以我真的希望你有一个更好的。

我的最终解决方案是:

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));
var results=ES.Search(
s=>s.TrackScores()
.Query(q=>q.Range(v=>v.OnField(x=>x.ExpirationDate).greaterequals(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).操作符(操作符.And).Query(searchTerm))).Boost(1)))
.Sort(doc=>doc.OnField(“\u score”).Descending())
.SortDescending(doc=>doc.Date));

现在我正在考虑定制评分。有没有一种方法只使用boost分数(不包括相关性等)来计算分数?也许我需要这样的东西
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));