关于Elasticsearch的精确值查找(term)不生效问题
文章目录
- 问题
- 原因
- 解决方案
- ①将字段的type设置为keyword
- ②将该字段设置成 not_analyzed 无需分析的
问题
常用的 term 查询, 可以用它处理数字(numbers)、布尔值(Booleans)、日期(dates)以及文本(text)。term查询数字的时候并没有什么问题,但是当我们对字符串类型的字段进行term查询时可能会得到意想不到的情况,可能明明有记录却查询不到,也可能查询出不符合预期的记录。
原因
ES会默认给每个字段进行分词然后建立倒排索引。比如,有两条JSON数据如下:
[{"id" : 1"searchField" : "abc#def"},{"id" : 2"searchField" : "abc#xyz"}
]
使用ES提供的analyze API 可以看到分词结果如下:
按照上面的分词结果,那么当我们将这两条数据插入ES的时候,建立的倒排索引如下:
Term | Counter | DocId |
---|---|---|
abc | 2 | 1,2 |
def | 1 | 1 |
xyz | 1 | 2 |
注意:如果字段内容是大写的,那么在分词生成索引后,索引的项目会变成小写,比如上面的两条数据是ABC#DEF和ABC#XYZ,那么生成的索引也和上面的一样。此时由于索引项是小写,因此term查询ABC是查不到的,必须要查询abc;match查询ABC是可以查询到的,因为match会进行分词然后再匹配。
①使用term精确查询searchField为abc#def的记录:
{"query": {"term": {"searchField":"abc#def"}}
}
此时得到的结果是空,我们无法获得期望的结果,问题不在 term 查询,而在于abc#def并不在我们的倒排索引中。
②使用term精确查询searchField为abc的记录:
{"query": {"term": {"searchField":"abc"}}
}
此时得到的结果是两条数据都被检索出来。
根据建立的倒排索引不难发现,当精确匹配abc时,那么会命中如下的索引,它的DocId是1,2,因此会查出两条记录。
解决方案
①将字段的type设置为keyword
明确字段是否需要分词,不需要分词的字段就将type设置为keyword,可以节省空间和提高写性能。
ElasticSearch 5.0以后,String字段被拆分成两种新的数据类型: text用于全文搜索,会分词,而keyword用于关键词搜索,不进行分词。对于字符串类型的字段,ES默认会再生成一个keyword字段用于精确索引。默认mapping如下:
"mapping": {"properties": {"id": {"type": "long"},"searchField": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}
②将该字段设置成 not_analyzed 无需分析的
告诉 Elasticsearch该字段具有精确值,要将index属性设置成 not_analyzed 无需分析的。也是在mapping中进行设置,例如:
"mapping": {"properties": {"id": {"type": "long"},"searchField": {"type": "text","index": "not_analyzed"}}
如果是使用Java High Level REST Client 操作Elasticsearch的话可以参考官方API进行设置。
例如:
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{builder.startObject("properties");{builder.startObject("message");{builder.field("type", "text");}builder.endObject();}builder.endObject();
}
builder.endObject();
request.source(builder);
index 属性控制怎样索引字符串。它可以是下面三个值:
① analyzed:首先分析字符串,然后索引它。换句话说,以全文索引这个域。
② not_analyzed:索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
③ no:不索引这个域。这个域不会被搜索到。
注意:其他简单类型(例如 long , double , date 等)也接受 index 参数,但有意义的值只有 no 和 not_analyzed , 因为它们永远不会被分析。
关于Elasticsearch的精确值查找(term)不生效问题相关推荐
- elasticsearch拼写纠错之Term Suggester
一.什么是拼写纠错 拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户:拼写纠错是一种改善用户体验的功能: elasticsearch提供了以下不同类型的s ...
- 为什么 elasticsearch 要避免使用term查询text类型的字段
文章目录 term 查询 参数 value boost 避免使用term查询text类型的字段 1.创建一个含有text类型字段full_text 2.索引一个文档 3.在full_text字段使用t ...
- kibana操作elasticsearch:词条匹配(term)
- 分布式搜索elasticsearch搜索功能【进阶】
elasticsearch搜索功能 分布式搜索elasticsearch搜索功能 1.DSL查询文档 1.1 DSL查询分类 1.2 全文检索查询 1.3 精准查询 1.4 地理坐标查询 1.5 组合 ...
- es查询所欲_Elasticsearch基本查询总结
Elasticsearch是一个分布式文档存储.Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构.当集群中有多个Elasticsearch节点时,存储 ...
- php多关键词精确查找,查找多个精确值 | Elasticsearch: 权威指南 | Elastic
查找多个精确值edit term 查询对于查找单个值非常有用,但通常我们可能想搜索多个值. 如果我们想要查找价格字段值为 $20 或 $30 的文档该如何处理呢? 不需要使用多个 term 查询,我们 ...
- 13.Elasticsearch 7.15 Query DSL 之 term查询、terms查询和terms set查询
文章目录 term 查询 介绍 term 的顶级参数 field的二级参数 terms查询 介绍 terms的顶级参数 terms set 查询 介绍 terms set的顶级参数 field的二级参 ...
- Elasticsearch实战(五)---高级搜索 Match/Match_phrase/Term/Must/should 组合使用
Elasticsearch实战-Match/Match_phrase/term/filter 及Must should 组合并列使用 文章目录 Elasticsearch实战-Match/Match_ ...
- Elasticsearch term vector
Elasticsearch term vector 一. 概念 二. term vector数据的出现时机 三. 数据探查 3.1 最基本的数据探查 3.2 探查指定term的term vector ...
- Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用
text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...
最新文章
- 我酸了~腾讯员工平均月薪 7.6 万 | 每日趣闻
- 转MFC消息映射梳理
- 清除右键菜单CMD入口
- 「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」
- Cocoa原理指南-学习和实践1
- EGLSurfaces 和 OpenGL ES
- ASP.NET里创建Microsoft Word文档
- Realtime Ray Tracing RenderMan Point Cloud
- 常见的问题:https://localhost:1158/em 无法打开
- 十四、传智书城前台程序设计
- FreeRTOS源码分析与应用开发06:软件定时器
- dell装双系统linux系统,记录DELL灵越7590/7591安装Ubuntu+Win10双系统
- 开源3问:95%的技术人都不知道的开源真相
- C语言:从键盘输入一个正整数,将该数倒序输出。
- 使用Java操作Redis
- 用matlab做一个有刻度的网格,MATLAB已知坐标如何画网格图
- 第43期ACM_ICPC亚洲区域赛(焦作站)感想
- 什么是5G CPE?
- IE浏览器不能上网而其他浏览器可以正常上网解决办法
- Field baseMapper in com.xxx required a single bean,but 100 were found --------Mybatis-Plus
热门文章
- Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
- 【Dart语言第5篇】运算符
- Android调试萤石云摄像头时,出现400036错误
- php桌面快捷方式图标,window_Win10桌面图标没了怎么办?Win10桌面快捷方式消失了解决方法,不少使用windows10系统的朋友都 - phpStudy...
- grub2启动出错(Error11:Unrecognized device string)
- python快速编程入门教材免费阅读,Python快速编程入门(第2版)
- 小米笔记本 镜像_小米笔记本Air 13.3 指纹版安装黑苹果 macOS High Sierra 10.13 教程...
- 滤波笔记四:扩展卡尔曼滤波
- Unity【HTC Vive Noitom】- 关于动作捕捉的两种解决方案
- libcef-Vs2017-下载编译第一个libcef3项目