我需要在文档中的三个字段中搜索一个术语,并根据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)
但它并不理想,所以我真的希望你有一个更好的。
答案 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));