当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch排序嵌套字段

通啸
2023-03-14

我将Elasticsearch 6与PHP结合使用。

我的文档有一个嵌套字段,如下所示:

    "prices" : {
        "type" : "nested",
        "properties" : {
          "date" : {
            "type" : "date"
          },
          "duration" : {
            "type" : "short"
          },
          "persons" : {
            "type" : "short"
          },
          "pets" : {
            "type" : "short"
          },
          "price" : {
            "type" : "float"
          }
        }

基本上每个文档都有很多价格,但我知道每个文档只有一个价格与过滤器/查询匹配。

我用它来搜索和排序,改编自这里的教程:https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html(对PHP数组格式表示抱歉):

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'nested' => [
                'path' => 'prices',
                'query' => [
                    'bool' => [
                        'must' => [
                            ['match' => ['prices.duration' => 14]],
                            ['match' => ['prices.date' => '2018-09-01']],
                            ['match' => ['prices.pets' => 2]],
                            ['match' => ['prices.persons' => 2,]]
                        ]
                    ]
                ]
            ]
        ],
        'sort' => [
            'prices.price' => [
                'order' => 'asc',
                'mode' => 'min',
                'nested_filter' => [
                    'bool' => [
                        'must' => [
                            ['match' => ['prices.duration' => 14]],
                            ['match' => ['prices.date' => '2018-09-01']],
                            ['match' => ['prices.pets' => 2]],
                            ['match' => ['prices.persons' => 2]]
                        ]
                    ]
                ]
            ]
        ]
    ]
];

我得到了正确的结果,但文档没有按价格排序。如何正确排序?文档应按与过滤器匹配的一个价格排序。

共有1个答案

满雨石
2023-03-14

显然,我使用的是一份旧文件。以上查询的正确排序部分是:

    'sort' => [
        'prices.price' => [
            'order' => 'asc',
            'mode' => 'avg',
            'nested' => [
                'path' => 'prices',
                'filter' => [
                    'bool' => [
                        'must' => [
                            ['match' => ['prices.duration' => 14]],
                            ['match' => ['prices.date' => '2018-09-01']],
                            ['match' => ['prices.pets' => 2]],
                            ['match' => ['prices.persons' => 2]]
                        ]
                    ]
                ]
            ]
        ]
    ]
 类似资料:
  • 问题内容: 我正在尝试在Elasticsearch中进行嵌套排序,但到目前为止没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用的映射: 使用SearchRequestBuilder(JAVA)进行排序: 这行得通,但没有给出想要的结果(例如,首先是“叫卖”,然后是“罗杰”)。 我错过了什么吗?有没有办法表明Elasticsearch访问数组authorList的ind

  • 我试图在Elasticsearch中进行嵌套排序,但到目前为止还没有成功。 我的数据结构: 我想根据文档中第一作者的姓氏对文档进行排序。 使用SearchRequestBuilder(JAVA)进行排序: 这是有效的,但不能给出想要的结果(例如,首先是“霍金”,然后是“罗杰”)。 我是不是漏掉了什么?是否有一种方法可以指示Elasticsearch访问数组authorlist的index=0?是否

  • Sup社区。我有个问题。我正在使用Elasticsearch 6.4 我的数据结构的一部分: 我需要得到按成本排序的文档desc,我需要排序dirs字段中的值date_by字段与nulls-first。 如何对嵌套字段内的值进行排序,而不按此嵌套字段对文档进行排序?

  • Elasticsearch排序不适用于嵌套字段。它显示了升序和降序的混合值。比如40,30,50。它不是按升序显示的:30,40,50 查询:

  • 在这里,我得到了错误: “无效的术语聚合顺序路径[price>price>price.max]。术语桶只能在子聚合器路径上排序,该路径由路径中的零个或多个单桶聚合和路径末尾的最终单桶或度量聚合组成。子路径[price]指向非单桶聚合” 如果我按持续时间聚合排序,查询可以正常工作,如 那么,有什么方法可以通过嵌套字段上的嵌套聚合来排序聚合吗?

  • 问题内容: 我有以下ES内容,基本上是网站中包含嵌套商品的产品列表。 如何按站点详细信息的数量排序? tnx! 问题答案: 从问题的示例来看,它看起来像是单个文档,但是单个json文档不可能在同一级别具有相同名称的多个字段。 因此,假设每个字段代表一个不同的顶级文档