gpt4 book ai didi

Elasticsearch 按内部命中文档计数对父级进行排序

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

假设我在 Elasticsearch 中索引了一堆 ProductStore,其中有产品可用。例如,文档看起来像这样:

{
name: "iPhone 6s",
price: 600.0,
stores: [
{
name: "Apple Store Union Square",
location: "San Francisco, CA"
},
{
name: "Target Cupertino",
location: "Cupertino, CA"
},
{
name: "Apple Store 5th Avenue",
location: "New York, NY"
}
...
]
}

并使用嵌套类型,映射将是:

"mappings" : {
"product" : {
"properties" : {
"name" : {
"type" : "string"
},
"price" : {
"type" : "float"
},
"stores" : {
"type" : "nested",
"properties" : {
"name" : {
"type" : "string"
},
"location" : {
"type" : "string"
}
}
}
}
}
}

我想创建一个查询来查找特定位置(例如“CA”)可用的所有产品,然后按匹配的商店数量排序。我知道 Elasticsearch 有一个 inner hit允许我在嵌套的 Store 文档中找到匹配项的功能,但是是否可以根据内部匹配项的 doc_countProduct 进行排序?并进一步扩展问题,是否可以根据某些内部聚合对父文档进行排序?提前致谢。

最佳答案

您尝试实现的目标是可能的。目前您没有得到预期的结果,因为默认情况下 score_mode 参数在 nested query 中是 avg ,因此如果 5 家商店匹配给定的产品,它们的得分可能低于匹配 2 家商店的商店,因为 _score 是通过取平均值计算的。

通过将 score_mode 指定为 sum,可以通过对所有 inner hits 进行求和 来解决此问题。一个小问题可能是 field length norm较短 field 的比赛比大 field 获得更高的分数。因此在您的示例中,Cupertino, CA 将获得比 San Francisco, CA 更高的分数。您可以使用 inner hits 检查此行为。要解决这个问题,您需要禁用 field norms。将位置映射更改为

"location": {
"type": "string",
"norms": {
"enabled": false
}
}

之后,此查询将为您提供所需的结果。我包含了 inner hits 来演示每个匹配的嵌套文档的 equal score

{
"query": {
"nested": {
"path": "stores",
"query": {
"match": {
"stores.location": "CA"
}
},
"score_mode": "sum",
"inner_hits": {}
}
}
}

这将根据存储的匹配数量排序产品。

希望这对您有所帮助!

关于Elasticsearch 按内部命中文档计数对父级进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34321818/

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