【问题标题】:ElasticSearch 5: sorting by nested key and value results in "Fielddata is disabled on text fields by default"ElasticSearch 5:按嵌套键和值排序导致“默认情况下在文本字段上禁用字段数据”
【发布时间】:2017-10-04 21:46:08
【问题描述】:

我正在尝试通过一组嵌套的键值对对 ElasticSearch 5 中的搜索结果进行排序。即:

我有以下结果(伪结构,为了简单起见):

{
  "hit1": {
    "nested_objects": [
      {
        "Key": "abc",
        "Value": 0.1
      },
      {
        "Key": "def",
        "Value": 0.3
      }
    ]
  },
  "hit2": {
    "nested_objects": [
      {
        "Key": "abc",
        "Value": 0.9
      },
      {
        "Key": "def",
        "Value": 0.1
      }
    ]
  }
}

我希望它按“Key = 'abc' 的最高值”排序,这意味着“hit2”将排在首位。

我的映射如下:

{
  "test_index": {
    "mappings": {
      "test_type": {
        "properties": {
          "nested_objects": {
            "type": "nested",
            "properties": {
              "Key": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "Value": {
                "type": "float"
              }
            }
          }
        }
      }
    }
  }
}

我已尝试遵循以下建议:

Sort elastic search query based on a nested key value array

Sort nested object in Elasticsearch

...但我一直收到以下错误:

"Fielddata is disabled on text fields by default"

重现此情况的排序尝试示例:

{
  "sort": [
    {
      "nested_objects.Key": {
        "order": "desc",
        "nested_path": "nested_objects",
        "nested_filter": {
          "term": { "nested_objects.Key": "abc" }
        }
      }
    }
  ]
}

解决此问题的最佳实践方法是什么?启用字段数据(使用大量内存)真的是这里唯一的选择吗?

【问题讨论】:

    标签: sorting elasticsearch


    【解决方案1】:

    在您的示例中,您按键排序,但您说要按值排序。默认情况下,键不可排序(正如 Taras 指出的那样,您必须使用“.keyword”对该字段进行排序),这会引发您遇到的错误。

    要彻底解决您的问题,请按值排序并按键过滤。您已经按 Key 过滤(您不需要使用“.keyword”来执行此操作),因此您只需按 Value 排序:

    {
      "sort": [
        {
          "nested_objects.Value": {   <-- SOLUTION
            "order": "desc",
            "nested_path": "nested_objects",
            "nested_filter": {
              "term": { "nested_objects.Key": "abc" }
            }
          }
        }
      ]
    }
    

    【讨论】:

      【解决方案2】:

      分析Text 数据类型(此类型用于全文搜索)。 对分析的字段进行排序很昂贵,这就是默认情况下禁用它的原因。
      通常您不需要按分析字段排序,因此请尝试按关键字字段排序:

      "term": { "nested_objects.Key.keyword": "abc" }
      

      阅读this 文档以更深入地了解问题。

      【讨论】:

      • 感谢 Taras - 这是有道理的,并且解决了一半的问题(字段数据错误)。我仍然需要按“abc”的值排序 - 我可以在以下位置添加更多术语:"term": { "nested_objects.Key.keyword": "abc" }
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      相关资源
      最近更新 更多