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));
我只需要在文档中的三个字段中搜索术语,并根据找到搜索术语的位置对结果进行排序。 因此,例如,找到 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));