ElasticSearch 5:按嵌套键和值排序"默认情况下,文本字段禁用Fielddata"

时间:2017-10-04 09:12:28

标签: sorting elasticsearch

我试图通过一组嵌套的键值对在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" }
        }
      }
    }
  ]
}

解决此问题的最佳做法是什么?启用现场数据(使用大量ram)真的是这里唯一的选择吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

要完全解决您的问题,请按值排序并按键过滤。你已经按Key过滤了(你不需要使用“.keyword”这样做),所以你所要做的就是按值排序:

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