【问题标题】:Sorting on nested fields containing null values in elasticsearch在elasticsearch中对包含空值的嵌套字段进行排序
【发布时间】:2019-08-06 16:01:19
【问题描述】:

我正在尝试对 elasticsearch 中的嵌套字段进行排序,但它总是在排序列表顶部显示具有空值嵌套字段的文档,同时按升序排序。我想排序(按升序和降序)并希望空值嵌套字段文档出现在排序列表的末尾。

这是我正在使用的排序查询:

{
  "query": {
    "match_all": {}
  },
  "sort": {
    "_script": {
      "type": "string",
      "order": "asc",
      "script": {
        "lang": "painless",
        "source": "def val=params['_source'].tags; if(val==null){return '';}else{return params['_source'].tags} "
      }
    }
  }
}

以下是我应用的与嵌套“标签”字段相关的映射:

"tags": {
            "type": "nested",
            "properties": {
              "tag": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                },
                "analyzer": "index_analyzer",
                "search_analyzer": "search_analyzer"
              }
            }
          }

样本负载:

"tags": [
  {
    "tag": "check"
  },
  {
    "tag": "production"
  },
  {
    "tag": "test"
  }
]

【问题讨论】:

  • 对不起,我没有时间给出真正的答案,但您的用例只是一个标准的嵌套排序,缺少:“_last”属性。在此处查看文档elastic.co/guide/en/elasticsearch/reference/7.3/…
  • 我试过这个,但每当我尝试对缺少标签字段的文档进行排序时,它都会给出空指针异常。
  • 我认为你不明白:p 你不需要自定义脚本来做到这一点。我会在一分钟内给出真正的答案:)

标签: elasticsearch


【解决方案1】:

由于标签是嵌套属性,您需要在其上应用nested sort,并将没有标签的文档放在结果列表的最后,您只需添加使用missing property

nb:我们在标签的子字段关键字中排序,因为排序键不需要分析。

这里是示例查询:

{
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "tags.tag.keyword": {
                "order": "asc",
                "missing": "_last",
                "nested": {
                    "path": "tags"
                }
            }
        }
    ]
}

由于您正在对多值文本字段进行排序,我建议您查看有关sorting modes 的排序文档部分,以便更好地了解这种情况下的弹性搜索行为。

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多