背景说明

最近在做一个 Elasticsearch 的分页查询,并且对查询结果按照特定字段进行排序的功能。

但是执行结果却报错,报错信息如下:

{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [state] 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": "alarm",
"node": "hdLJanxRTbmF52eK6-FFgg",
"reason": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [state] 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 alarm/_search           // index为 alarm
{
"query" : {
"bool" : {
"must" : [
{
"match_phrase" : {
"state" : {
"query" : "confirmed",
"slop" : 0,
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
"from": 1, // 分页,第几页开始
"size": 5, // 分页,每页显示多少条
"sort": { // 排序,按照 state 字段降序排序
"state": {
"order": "desc" }
}
}

测试分析:

1)去除排序语句,分页查询是OK的,问题出在了排序字段;

2)按照 integer 类型 或者 date 类型的字段排序都是OK的,但是 string 类型排序报错(示例中的state字段为 string 类型)

解决方案

其实在报错信息里已经提供了解决方案:

需要对 string类型的字段,单独设置加载到内存中,才能排序。

Set fielddata=true on [state] in order to load fielddata in memory by uninverting the inverted index. 

具体设置操作如下:

PUT alarm/_mapping/alarmInfoHistory/
{
"properties":{
"state":{
"type":"text",
"fielddata":true
}
}
}

执行结果:

{
"acknowledged": true
}

再次执行排序查询查询语句,就OK了。

Good Luck~

PS:

如果想按照多个字段排序(按照 statealarmGrade 降序排序),SQL参考如下:

{
"query":{
"bool":{
"must":[
{
"match_phrase":{
"state":{
"query":"confirmed",
"slop":0,
"boost":1
}
}
}
],
"disable_coord":false,
"adjust_pure_negative":true,
"boost":1
}
},
"from":1,
"size":10,
"sort":[
{
"state":{
"order":"desc"
}
},
{
"alarmGrade":{
"order":"desc"
}
}
]
}

Elasticsearch 6.2.3版本 string 类型字段 排序 报错 Fielddata is disabled on text fields by default的更多相关文章

  1. Elasticsearch 6.2.3版本 执行聚合报错 Fielddata is disabled on text fields by default

    背景说明 执行<Elasticsearch 权威指南>的示例,在执行聚合查询的时候,报错 Fielddata is disabled on text fields by default. ...

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

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

  3. elasticsearch报Fielddata is disabled on text fields by default

    我刚玩elk没几天,今天启动kibana之后执行查询看见elasticsearch报了一个错误 Caused by: java.lang.IllegalArgumentException: Field ...

  4. Elasticsearch 报错:Fielddata is disabled on text fields by default. Set `fielddata=true` on [`your_field_name`] in order to load fielddata in memory by uninverting the inverted index.

    Elasticsearch 报错: Fielddata is disabled on text fields by default. Set `fielddata=true` on [`your_fi ...

  5. linq中将int类型转换为string类型,toString()报错

    今天同事在调试程序的时候,报了一个不寻常的错误, “LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 ...

  6. Elasticsearch 6.2.3版本 同一个index新增type报错 Rejecting mapping update to [website] as the final mapping would have more than 1 type: [blog2, blog]

    在website的index下已经存在一个名为blog的type.想在website下,新增一个名为blog2的type. 执行语句如下: PUT /website/blog2/1 { "t ...

  7. mysql语句中把string类型字段转datetime类型

    mysql语句中把string类型字段转datetime类型   在mysql里面利用str_to_date()把字符串转换为日期   此处以表h_hotelcontext的Start_time和En ...

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

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

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

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

随机推荐

  1. redis如何查看主从状态信息master和salve

    首先你需要连接上redis [root@localhost src]# ./redis-cli -p 6384 --第一步从客户端命令工具连接redis 127.0.0.1:6384> auth ...

  2. 多个jar包合并成一个jar包(ant)

    https://blog.csdn.net/gzl003csdn/article/details/53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具. ...

  3. oracle删除临时表空间一直处于等待状态

    现象: 新建一个临时表空间mytemp 然后将其改为默认临时表空间后,执行一条带order by的查询语句,查询出结构后, 修改默认临时表空间为原来的temp,然后执行 drop tablespace ...

  4. ecshop新版不能在模板文件.dwt和.lbi中直接添加php代码的解决方法

    ecshop新版不能在模板文件.dwt和.lbi中直接添加php代码了,为什么呢? 因为直接在模板中加入php函数和代码,没有经过过滤,容易造成安全隐患.程序源码安全是非常重要的. 不过如果有朋友希望 ...

  5. 批处理清除svn版本信息

    for /r . %%a in (.) do @if exist "%%a\.svn" rd /s /q "%%a\.svn"

  6. 关于log4j的配置文件

    因为要在spring中添加Mongodb,在网上查阅资料的时候我发现有人在web.xml中添加如下代码: <context-param>       <param-name>l ...

  7. Kattis - bitwise Bitwise (RMQ+尺取+树上dfs)

    题意:有一个长度为n的序列,让你把它分成k段,段内元素取or,段间取and,求能够得到的最大值. 这个算法是我和xz场上yy出来的,然而时间不够了没写出来,而且时间复杂度是$O(nlogn+nlogA ...

  8. DevExpress ASP.NET v19.1版本亮点:发布全新的Gantt控件

    行业领先的.NET界面控件DevExpress 发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Controls v19.1中新增的一些控件及增强的控件功能 ...

  9. qt5-Qt Creator使用

    设置编码: 工具-->选项-->文本编辑器-->行为-->编辑器 中文编译失败的解决: 编辑-->--> 在头文件中增加:--解决乱码问题(文本所在的头文件) #i ...

  10. 【转】深入理解Java多态性

    http://developer.51cto.com/art/200906/130414.htm http://blog.csdn.net/cyzero/article/details/7266831 ...