zoukankan      html  css  js  c++  java
  • 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": [
              "保"
            ]
          }
        ]
      }
    }

  • 相关阅读:
    Lua中table的实现-《Lua设计与实现》
    unity3D 知识点随手记
    游戏随笔之事件系统的设计
    游戏随笔之游戏资源池的设计
    MMORPG战斗系统随笔(四)、优化客户端游戏性能
    MMORPG战斗系统随笔(三)、AI系统简介
    vue-cli3关闭eslint语法检查
    Vue3+与Vue2共存
    php7中??和?:的区别
    react-hook生命周期
  • 原文地址:https://www.cnblogs.com/guokai870510826/p/11400066.html
Copyright © 2011-2022 走看看