ES使用text类型字段排序报错

elasticsearch text字段排序报错解决
使用elasticsearch 进行排序的时候,我们一般都会排序数字、日期。但是在排序text类型的时候就会出现错误。

GET xytest/sutdent/_search
{
  "sort":[
      {"region": {"order": "asc"}}
    ]
  , "from": 0
  , "size": 2
}

结果如下:
{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "xytest",
        "node": "6h-7wPJmQqWGfz6nbgqjjQ",
        "reason": {
          "type": "illegal_argument_exception",
          "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
        }
      }
    ],
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
    }
  },
  "status": 400
}

主要原因是:"Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."

参考官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html

方案一:我们可以用region.keyword进行聚合,排序。用region用来查询。那么我们对我们的查询进行修改
GET xytest/sutdent/_search
{
  "sort":[
      {"region.keyword": {"order": "asc"}}
    ]
  , "from": 0
  , "size": 2
}

修改后查询结果:
{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 6,
    "max_score": null,
    "hits": [
      {
        "_index": "xytest",
        "_type": "sutdent",
        "_id": "6",
        "_score": null,
        "_source": {
          "sid": "00006",
          "name": "牧琢杭",
          "age": "26",
          "region": "广东省 湛江市 赤坎区",
          "grade": [
            {
              "数学": 80
            },
            {
              "语文": 63
            },
            {
              "英语": 90
            }
          ]
        },
        "sort": [
          "广东省 湛江市 赤坎区"
        ]
      },
      {
        "_index": "xytest",
        "_type": "sutdent",
        "_id": "5",
        "_score": null,
        "_source": {
          "sid": "00005",
          "name": "范旭",
          "age": "30",
          "region": "**自治区 和田地区 和田县",
          "grade": [
            {
              "数学": 90
            },
            {
              "语文": 69
            },
            {
              "英语": 60
            }
          ]
        },
        "sort": [
          "**自治区 和田地区 和田县"
        ]
      }
    ]
  }
}

方案二:这是region这个排序字段的fileddata为true。
PUT xytest/_mapping/sutdent
{
  "properties": {
    "region":{
      "type": "text",
      "fielddata": true
    }
  }
}

设置结果:
{
  "acknowledged": true
}

我们再次运行最开始的查询:
GET xytest/sutdent/_search
{
  "sort":[
      {"region": {"order": "asc"}}
    ]
  , "from": 0
  , "size": 2
}

返回结果:
{
  "took": 130,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 6,
    "max_score": null,
    "hits": [
      {
        "_index": "xytest",
        "_type": "sutdent",
        "_id": "6",
        "_score": null,
        "_source": {
          "sid": "00006",
          "name": "牧琢杭",
          "age": "26",
          "region": "广东省 湛江市 赤坎区",
          "grade": [
            {
              "数学": 80
            },
            {
              "语文": 63
            },
            {
              "英语": 90
            }
          ]
        },
        "sort": [
          "东"
        ]
      },
      {
        "_index": "xytest",
        "_type": "sutdent",
        "_id": "4",
        "_score": null,
        "_source": {
          "sid": "00004",
          "name": "符龙",
          "age": "37",
          "region": "河北省 保定市 清苑县",
          "grade": [
            {
              "数学": 80
            },
            {
              "语文": 79
            },
            {
              "英语": 69
            }
          ]
        },
        "sort": [
          "保"
        ]
      }
    ]
  }
}

上一篇:干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践


下一篇:HDU 3669 Cross the Wall