gpt4 book ai didi

elasticsearch - ElasticSearch NEST-如何在搜索中区分字段的优先级

转载 作者:行者123 更新时间:2023-12-02 23:35:14 26 4
gpt4 key购买 nike

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

我希望按以下顺序查看它们:3、1、2。

我以为我可以使用Boosting做到这一点。
现在,我使用以下方法:

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个单词与field1中的单词相比,则后者的得分较小。

有人可以告诉我我应该在查询中进行哪些更改,以便无论field2和field3中有多少个匹配项(并且field 2中的匹配项具有比field3中任意数量的匹配项更大的分数),field1中的匹配项得分更高?

我看到的一种解决方案是像这样为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));

关于elasticsearch - ElasticSearch NEST-如何在搜索中区分字段的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31836239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com