假设我正在为Elasticsearch索引一堆产品可用的Product
s和Store
s.例如,文档看起来像:
{ 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" } ... ] }
并使用该nested
类型,映射将是:
"mappings" : { "product" : { "properties" : { "name" : { "type" : "string" }, "price" : { "type" : "float" }, "stores" : { "type" : "nested", "properties" : { "name" : { "type" : "string" }, "location" : { "type" : "string" } } } } } }
我想创建一个查询来查找某些位置可用的所有产品,比如"CA",然后按匹配的商店数量排序.我知道Elasticsearch有一个内部命中功能,它允许我在嵌套Store
文档中找到命中,但是Product
根据doc_count
内部命中可能进行排序?并进一步扩展问题,是否可能基于某些内部聚合对父文档进行排序?提前致谢.
你想要实现的目标是可能的.目前你没有得到预期的结果,因为默认score_mode
参数是avg
在嵌套查询,所以如果5个存储给定的产品符合他们可能得分低于说一个只匹配,因为2个存储_score
通过取平均值来计算.
通过指定as 可以解决summing
所有问题.一个小问题可能是场长规范,即较短场的比赛得分高于较大场.所以在你的例子库比蒂诺,CA将比加利福尼亚州旧金山高一点.您可以检查这种行为.要解决此问题,您需要禁用.更改到inner hits
score_mode
sum
score
inner hits
field norms
location mapping
"location": { "type": "string", "norms": { "enabled": false } }
之后,此查询将为您提供所需的结果.我包括为每个匹配的嵌套文档inner hits
演示equal score
.
{ "query": { "nested": { "path": "stores", "query": { "match": { "stores.location": "CA" } }, "score_mode": "sum", "inner_hits": {} } } }
这将使sort
产品基于存储的匹配数量.
希望这可以帮助!