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": [
          "保"
        ]
      }
    ]
  }
}

ES使用text类型字段排序报错的更多相关文章

  1. Elasticsearch 6.2.3版本 string 类型字段 排序 报错 Fielddata is disabled on text fields by default

    背景说明 最近在做一个 Elasticsearch 的分页查询,并且对查询结果按照特定字段进行排序的功能. 但是执行结果却报错,报错信息如下: { "error": { " ...

  2. ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

    背景: 由于本人使用的是6.0以上的版本es,在使用发现很多中文博客对于mapping参数的说明已过时.ES6.0以后有很多参数变化. 现我根据官网总结mapping最新的参数,希望能对大家有用处. ...

  3. Sql 中text类型字段判断是否为空

    用 len关键字,字段=''会报错:数据类型 text 和 varchar 在 equal to 运算符中不兼容. 正确方法: 1. 字段 is null 2. datalength(字段)=0 注: ...

  4. [转]sql中判断text类型字段是否为空

    用 字段=''会报错:数据类型 text 和 varchar 在 equal to 运算符中不兼容. 正确方法: 1. 字段 is null 2. datalength(字段)=0 注:SQL中的DA ...

  5. MSSQL数据库中Text类型字段在PHP中被截断之解 (转)

    在PHP中使用了MSSQL数据库,恰巧数据库中又使用了Text类型字段,于是问题产生了.每次从数据库中查询得到的数据总是被莫名的截断,一开始是以为我使用的PHP框架中对字符串的长度有所限制,后来发现这 ...

  6. MySQL 表与字段编码格式报错

    MySQL 表与字段编码格式报错 一.数据库,表,字段编码格式都为latin1(iso-8859-1) .当数据保存到数据库后,中文显示乱码. 解决办法: 1.在访问数据库连接串中添加编码格式: &l ...

  7. 单元测试时候使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且应采用一个TestContext类型的参数报错的解决办法

    using Microsoft.VisualStudio.TestTools.UnitTesting; 如果该DLL应用的是 C:\Program Files\Microsoft Visual Stu ...

  8. DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null

    DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...

  9. 使用like查询text类型字段

    使用like查询text类型字段 public bool Exists(GetReadType GRT, ClientMessageGetRead TypeID, string MessageID, ...

随机推荐

  1. 详解vue的diff算法原理

    我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时,vue ...

  2. [CSP-S模拟测试]:爬(贪心)

    题目传送门(内部题134) 输入格式 第一行两个数$N,L$. 接下来$N$行每行两个数$A_i,B_i$. 接下来$N$行每行一个整数$C_i$. 输出格式 一行一个整数表示答案,无解输出$-1$. ...

  3. [DTOJ3996]:Lesson5!(DP+拓扑+线段树)

    题目描述 “最短的捷径就是绕远路,绕远路就是我最短的捷径” 转眼就$Stage\ X$了,$Stage\ X$的比赛路线可以看做一个$n$个点$m$条边的有向无环图,每条边长度都是$1$.杰洛$\cd ...

  4. 创建新文件(包括上级文件夹),获取外置SD卡的根目录

    public String hebGetExternalRootDir(String externalAndriodSubDirPath){ if ( externalAndriodSubDirPat ...

  5. 【编程漫谈】Hello world!

    Hello world!是打开编程世界的第一把钥匙,只要你能运行出Hello world!,基本上就算入了个门了,因为程序正确的运行代表着基本开发环境都有了,包括编辑器,编译器,解释器,运行环境等待, ...

  6. RF中BDD编写

    工程结构 用户关键字 测试用例 运行日志

  7. StringUtils.isBlank()检验String 类型的变量是否为空

    在校验一个String类型的变量是否为空时,通常存在3中情况 是否为 null 是否为 "" 是否为空字符串(引号中间有空格)  如: "     ". Str ...

  8. P3956 棋盘

    P3956 棋盘 题解 注释都在代码里了 这道题可以用DFS做,记忆化搜索,维护一个money[ ][ ] 表示到达当前节点的最小花费 不需要记录VIS,因为有一个最小值判断,如果走重复的话一定会得到 ...

  9. [VBA]汇总多个工作簿的指定工作表到同一个工作簿的指定工作表中

    sub 汇总多个工作簿() Application.ScreenUpdating = False Dim wb As Workbook, f As String, l As String, n As ...

  10. 跨域请求配置 Amazon AWS S3 腾讯云 阿里云 COS OSS 文件桶解决方案以及推荐 Lebal:Research

    跨域请求配置 跨域请求指的就是不同的域名和端口之间的访问.由于 ajax 的同源策略影响.跨域请求默认是不被允许的. 使用@font-face外挂字体时,可能遇到跨域请求CROS问题:F12控制台报错 ...