admin管理员组

文章数量:1530257

elasticSearch Alternatively use a keyword field instead

    • 情景再现
    • 原因分析

情景再现

索引user中有三个字段,根据age进行排序查询出现的问题

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

然后就抛出来这么大一串的日志信息

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "user",
        "node": "oPHyvjEKR1u6ltdy9L2nsQ",
        "reason": {
          "type": "illegal_argument_exception",
          "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
        }
      }
    ],
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [age] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
      }
    }
  },
  "status": 400
}

原因分析

我们可以查看创建的索引的映射信息
查询映射

GET /user/_mapping

{
  "user" : {
    "mappings" : {
      "properties" : {
        "age" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
			省略。。。。。。
        }
      }
    }
  }
}

我们可以查询age的字段类型type ,是text,这个是不支持排序操作的,需要设置type位keyword才可以
也就是重新创建映射
第二种解决方案,就是直接指定是age的keyword进行查询

GET /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age.keyword": {
        "order": "desc"  
      }
    }
  ]
}

本文标签: AlternativelyElasticsearchFieldkeyword