gpt4 book ai didi

sorting - Elasticsearch:如何获取按匹配分数排序的字段的最高唯一值?

转载 作者:行者123 更新时间:2023-11-29 02:55:26 24 4
gpt4 key购买 nike

我有一组地址。让我们简化一下,假设唯一的字段是 postcodecitystreetstreetnumbername。我希望能够在用户输入邮政编码、城市和一些街道查询时建议街道列表。

例如,如果用户在 HTML 表单中输入:

postcode: 75010
city: Paris
street: rue des

我想得到一个街道列表,例如

'rue des petites écuries'
'rue des messageries'
...
'rue du faubourg poissonnière'
...

我可以向用户建议。

所以,我想获取“街道”字段的唯一值列表,根据它们与我在“街道”字段上的查询的匹配程度排序。我想为此查询获取 10 条最匹配的街道。

返回文档的查询如下所示:

{
"query": {
"bool": {
"must": [
{{"term": {"postcode": "75010"}},
{{"term": {city": "Paris"}},
{{"match": {"street": "rue des"}}
]
}
}
}

当然,同一条街道会出现多次,因为每条街道可以在集合中的不同地址出现多次。

我尝试使用“聚合”框架并添加了一个聚合:

{
"query": {
"bool": {
"must": [
{{"term": {"postcode": "75010"}},
{{"term": {city": "Paris"}},
{{"match": {"street": "rue des"}}
]
}
},
"aggs": {
"street_agg": {
"terms": {
"field": "street",
"size": 10
}
}
}
}

问题是它是自动排序的,不是根据分数,而是根据每个桶中文档的数量。

我想按照每个桶中任意文档的分数对桶进行排序(是的,从桶中的单个文档中获取分数就足够了,因为分数仅取决于街道的内容在我的示例中的字段)。

您将如何实现?

最佳答案

好的,所以实际上可以在 Elasticsearch aggregation order by top hit score 中找到解决方案但前提是你阅读了 Shadocko 在这里的评论:Elasticsearch aggregation order by top hit score ,我没有。

所以这里是任何感兴趣的人的解决方案,以及我 future 的自己:

{                                 
'query': {
'bool': {
'must': [
{'term': {'postcode': '75010'}},
{'term': {'city': 'Paris'}},
{'match': {'street.autocomplete': 'rue des'}}
]
}
},
'aggs': {
'street_agg': {
'terms': {
'field': 'street',
'size': 10,
'order': {
'max_score': 'desc'
}
},
'aggs': {
'max_score': {
'max': {'script': '_score'}
}
}
}
}
}

它并不完美,因为它使用了 max 聚合函数,这意味着它进行了不必要的计算(只需从桶中取出一个文档的分数就足够了)。但是似乎没有“pick one”聚合函数,只有minmaxavgsum,所以你必须这样做。好吧,我认为计算最大值并不是那么昂贵。

关于sorting - Elasticsearch:如何获取按匹配分数排序的字段的最高唯一值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50685190/

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