文章目录

  • 问题
  • 原因
  • 解决方案
    • ①将字段的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精确查询searchFieldabc#def的记录:

{"query": {"term": {"searchField":"abc#def"}}
}

此时得到的结果是空,我们无法获得期望的结果,问题不在 term 查询,而在于abc#def并不在我们的倒排索引中。

②使用term精确查询searchFieldabc的记录:

{"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)不生效问题相关推荐

  1. elasticsearch拼写纠错之Term Suggester

    一.什么是拼写纠错 拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户:拼写纠错是一种改善用户体验的功能: elasticsearch提供了以下不同类型的s ...

  2. 为什么 elasticsearch 要避免使用term查询text类型的字段

    文章目录 term 查询 参数 value boost 避免使用term查询text类型的字段 1.创建一个含有text类型字段full_text 2.索引一个文档 3.在full_text字段使用t ...

  3. kibana操作elasticsearch:词条匹配(term)

  4. 分布式搜索elasticsearch搜索功能【进阶】

    elasticsearch搜索功能 分布式搜索elasticsearch搜索功能 1.DSL查询文档 1.1 DSL查询分类 1.2 全文检索查询 1.3 精准查询 1.4 地理坐标查询 1.5 组合 ...

  5. es查询所欲_Elasticsearch基本查询总结

    Elasticsearch是一个分布式文档存储.Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构.当集群中有多个Elasticsearch节点时,存储 ...

  6. php多关键词精确查找,查找多个精确值 | Elasticsearch: 权威指南 | Elastic

    查找多个精确值edit term 查询对于查找单个值非常有用,但通常我们可能想搜索多个值. 如果我们想要查找价格字段值为 $20 或 $30 的文档该如何处理呢? 不需要使用多个 term 查询,我们 ...

  7. 13.Elasticsearch 7.15 Query DSL 之 term查询、terms查询和terms set查询

    文章目录 term 查询 介绍 term 的顶级参数 field的二级参数 terms查询 介绍 terms的顶级参数 terms set 查询 介绍 terms set的顶级参数 field的二级参 ...

  8. Elasticsearch实战(五)---高级搜索 Match/Match_phrase/Term/Must/should 组合使用

    Elasticsearch实战-Match/Match_phrase/term/filter 及Must should 组合并列使用 文章目录 Elasticsearch实战-Match/Match_ ...

  9. Elasticsearch term vector

    Elasticsearch term vector 一. 概念 二. term vector数据的出现时机 三. 数据探查 3.1 最基本的数据探查 3.2 探查指定term的term vector ...

  10. Elasticsearch教程(28) text和keyword区别 term和match区别 ik中文分词器使用

    text和keyword区别 term和match区别 ik中文分词器使用 一.前言 二.之前相关的博客 三.造点测试数据 1. 创建一个index 2. 插入测试数据 四.做一份试卷 第1题:tit ...

最新文章

  1. 我酸了~腾讯员工平均月薪 7.6 万 | 每日趣闻
  2. 转MFC消息映射梳理
  3. 清除右键菜单CMD入口
  4. 「更高更快更稳」,看阿里巴巴如何修炼容器服务「内外功」
  5. Cocoa原理指南-学习和实践1
  6. EGLSurfaces 和 OpenGL ES
  7. ASP.NET里创建Microsoft Word文档
  8. Realtime Ray Tracing RenderMan Point Cloud
  9. 常见的问题:https://localhost:1158/em 无法打开
  10. 十四、传智书城前台程序设计
  11. FreeRTOS源码分析与应用开发06:软件定时器
  12. dell装双系统linux系统,记录DELL灵越7590/7591安装Ubuntu+Win10双系统
  13. 开源3问:95%的技术人都不知道的开源真相
  14. C语言:从键盘输入一个正整数,将该数倒序输出。
  15. 使用Java操作Redis
  16. 用matlab做一个有刻度的网格,MATLAB已知坐标如何画网格图
  17. 第43期ACM_ICPC亚洲区域赛(焦作站)感想
  18. 什么是5G CPE?
  19. IE浏览器不能上网而其他浏览器可以正常上网解决办法
  20. Field baseMapper in com.xxx required a single bean,but 100 were found --------Mybatis-Plus

热门文章

  1. Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
  2. 【Dart语言第5篇】运算符
  3. Android调试萤石云摄像头时,出现400036错误
  4. php桌面快捷方式图标,window_Win10桌面图标没了怎么办?Win10桌面快捷方式消失了解决方法,不少使用windows10系统的朋友都 - phpStudy...
  5. grub2启动出错(Error11:Unrecognized device string)
  6. python快速编程入门教材免费阅读,Python快速编程入门(第2版)
  7. 小米笔记本 镜像_小米笔记本Air 13.3 指纹版安装黑苹果 macOS High Sierra 10.13 教程...
  8. 滤波笔记四:扩展卡尔曼滤波
  9. Unity【HTC Vive Noitom】- 关于动作捕捉的两种解决方案
  10. libcef-Vs2017-下载编译第一个libcef3项目