当前位置:  开发笔记 > 数据库 > 正文

Elasticsearch按内部命中排序父级doc count

如何解决《Elasticsearch按内部命中排序父级doccount》经验,为你挑选了1个好方法。

假设我正在为Elasticsearch索引一堆产品可用的Products和Stores.例如,文档看起来像:

{
  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内部命中可能进行排序?并进一步扩展问题,是否可能基于某些内部聚合对父文档进行排序?提前致谢.



1> ChintanShah2..:

你想要实现的目标是可能的.目前你没有得到预期的结果,因为默认score_mode参数是avg在嵌套查询,所以如果5个存储给定的产品符合他们可能得分低于说一个只匹配,因为2个存储_score通过取平均值来计算.

通过指定as 可以解决summing所有问题.一个小问题可能是场长规范,即较短场的比赛得分高于较大场.所以在你的例子库比蒂诺,CA将比加利福尼亚州旧金山高一点.您可以检查这种行为.要解决此问题,您需要禁用.更改到inner hitsscore_modesumscoreinner hitsfield normslocation 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产品基于存储的匹配数量.

希望这可以帮助!

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有