热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ES系列06:ik分词+Fulltextqueries之matchquery

引言:在学习Match查询之前,一定要先了解倒排序索引和Analysis分词【ElasticSearch系列05:倒排序索引与分词Analysis】&#xf

引言:在学习Match查询之前,一定要先了解倒排序索引和Analysis分词【ElasticSearch系列05:倒排序索引与分词Analysis】,这样才能快乐的学习ik分词和Match query查询。

本文结构【开局一张图】

Full text queries 将在执行前将查询字符串分词。因为ES本身提供的分词器不太适合中文分词,所以在学习全文查询前,我们先简单了解下中文分词插件ik分词。

一、ik 分词

官网简介:The IK Analysis plugin integrates Lucene IK analyzer (http://code.google.com/p/ik-analyzer/) into elasticsearch, support customized dictionary.

Analyzer: ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word

1.1 ik_max_word:细颗粒度分词

ik_max_word: 会将文本做最细粒度的拆分,比如会将“关注我系统学习ES”拆分为“关注,我,系统学,系统,学习,es”,会穷尽各种可能的组合,适合 Term Query;

# 测试分词效果
GET /_analyze
{"text": ["关注我系统学习ES"],"analyzer": "ik_max_word"
}
# 效果
{"tokens": [{"token": "关注","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "我","start_offset": 2,"end_offset": 3,"type": "CN_CHAR","position": 1},{"token": "系统学","start_offset": 3,"end_offset": 6,"type": "CN_WORD","position": 2},{"token": "系统","start_offset": 3,"end_offset": 5,"type": "CN_WORD","position": 3},{"token": "学习","start_offset": 5,"end_offset": 7,"type": "CN_WORD","position": 4},{"token": "es","start_offset": 7,"end_offset": 9,"type": "ENGLISH","position": 5}]
}

1.2 ik_smart:粗颗粒度分词

ik_smart: 会做最粗粒度的拆分,比如会将“关注我系统学习ES”拆分为“关注,我,系统,学习,es”,适合 Phrase 查询。

# 测试分词效果
GET /_analyze
{"text": ["关注我系统学习ES"],"analyzer": "ik_smart"
}
# 分词效果
{"tokens": [{"token": "关注","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "我","start_offset": 2,"end_offset": 3,"type": "CN_CHAR","position": 1},{"token": "系统","start_offset": 3,"end_offset": 5,"type": "CN_WORD","position": 2},{"token": "学习","start_offset": 5,"end_offset": 7,"type": "CN_WORD","position": 3},{"token": "es","start_offset": 7,"end_offset": 9,"type": "ENGLISH","position": 4}]
}

建议:一般情况下,为了提高搜索的效果,需要这两种分词器配合使用。既建索引时用 ik_max_word 尽可能多的分词,而搜索时用 ik_smart 尽可能提高匹配准度,让用户的搜索尽可能的准确。比如一个常见的场景,就是搜索"进口红酒"的时候,尽可能的不要出现口红相关商品或者让口红不要排在前面。

在简单学习了解了Ik分词后,我们就可以去学习es的全文查询了。

二、数据准备

2.1 创建index

PUT /tehero_index
{"settings": {"index": {"number_of_shards": 1,"number_of_replicas": 1}},"mappings": {"_doc": {"dynamic": false,"properties": {"id": {"type": "integer"},"content": {"type": "keyword","fields": {"ik_max_analyzer": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_max_word"},"ik_smart_analyzer": {"type": "text","analyzer": "ik_smart"}}},"createAt": {"type": "date"}}}}
}

简单解释下,content字段的映射:【就是一个字段配置多个分词器】

"content": {"type": "keyword", # 默认为 keyword类型"fields": {"ik_max_analyzer": { # 创建名为 ik_max_analyzer 的子字段"type": "text","analyzer": "ik_max_word", # 字段ik_max_analyzer 的倒排序索引分词器为ik_max_word"search_analyzer": "ik_max_word" # 检索关键词的分词器为ik_max_word},"ik_smart_analyzer": { # 创建名为 ik_smart_analyzer的子字段"type": "text","analyzer": "ik_smart" # 字段ik_smart_analyzer 的倒排序索引分词器为ik_smart# 字段ik_smart_analyzer 的检索关键词的分词器默认为ik_smart}}}

相比粗暴的用不同的字段去实现配置不同的分词器而言,一个字段配置多个分词器在数据的存储和操作上方便许多,只用储存一个字段,即可得到不同的分词效果。

三、Full text queries 之 match query(检索关键词会被分词)

3.1 match query:用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。

  • 1)批量导入数据

POST _bulk
{ "index" : { "_index" : "tehero_index", "_type" : "_doc", "_id" : "1" } }
{ "id" : 1,"content":"关注我,系统学编程" }
{ "index" : { "_index" : "tehero_index", "_type" : "_doc", "_id" : "2" } }
{ "id" : 2,"content":"系统学编程,就关注我" }
{ "index" : { "_index" : "tehero_index", "_type" : "_doc", "_id" : "3" } }
{ "id" : 3,"content":"系统学编程,求关注" }

  • 2)使用 content 的默认字段检索【keword】

# 1、发现查询不到结果
GET /tehero_index/_doc/_search
{"query":{"match":{"content":"系统学"}}
}
# 2、查询到id = 1 的文档
GET /tehero_index/_doc/_search
{"query":{"match":{"content":"关注我,系统学编程"}}
}

分析:【语句1】发现查询不到结果,此时content是keyword类型,是不会分词的,所以检索词需要和内容完全一样,【语句2】查询到文档1【keword与text的区别:ElasticSearch系列03:ES的数据类型】

  • 3)使用 content.ik_max_analyzer 字段检索【ik_max_word】

# 1、会检索出所有结果
GET /tehero_index/_doc/_search
{"query":{"match":{"content.ik_max_analyzer":"系统学"}}
}
# 2、改变检索分词器为ik_smart,只能检索到 文档1和文档2
GET /tehero_index/_doc/_search
{"query":{"match":{"content.ik_max_analyzer" : {"query" : "系统学","analyzer": "ik_smart"}}}
}

分析:【语句1】能查询到所有文档,因为检索词根据ik_max_word分词,得到Token(系统、系统学)【语句2】的检索词根据ik_smart分词,只能得到Token(系统学),不能匹配上文档3。

可以自己执行以下的分词测试语句,查看分词效果:

GET /_analyze
{"text": ["系统学"],"analyzer": "ik_smart"
}
GET /_analyze
{"text": ["系统学"],"analyzer": "ik_max_word"
}

通过上面的例子,我想大家已经理解了【ik_max_word 和 ik_smart】两种分词方式在实际运用中的区别。下面就来看看match query的参数有哪些?都有什么作用?

  • 4)match的核心参数:operator ——控制Token之间的逻辑关系,or/and

# 1、不配置,使用默认值or,得到文档1和文档2
GET /tehero_index/_doc/_search
{"query": {"match": {"content.ik_smart_analyzer": {"query": "系统学es"}}}
}
# 2、and,查询不到结果
GET /tehero_index/_doc/_search
{"query": {"match": {"content.ik_smart_analyzer": {"query": "系统学es","operator":"and"}}}
}

分析:检索词“系统学es”被分词为【系统学、es】两个Token,【语句1】的operator默认值为or,所以文档1和2可以被检索到;【语句2】的operator的值是and,也就是需要同时包含【系统学、es】这两个Token才行,所以没有结果。

  • 5)match的核心参数:zero_terms_query——停顿词检索

简单阅读即可:

POST _analyze

{

 "analyzer": "stop",

 "text": "to be or not to be"

}

那么就像 这种 字段中的 to be or not to be 这个短语中全部都是停顿词,一过滤,就什么也没有了,得不到任何 tokens, 那搜索时什么都搜不到。

zero_terms_query 就是为了解决这个问题而生的。它的默认值是 none ,就是搜不到停止词(对 stop 分析器字段而言),如果设置成 all ,它的效果就和 match_all 类似,就可以搜到了。

  • 6)match的核心参数:lenient—— 忽略数据类型转换异常

# id是integer类型,报错
GET /tehero_index/_doc/_search
{"query": {"match": {"id": {"query": "系统学"}}}
}
# 加上参数,不报错,语句正常执行
GET /tehero_index/_doc/_search
{"query": {"match": {"id": {"query": "系统学","lenient": "true"}}}
}
# 为可转换的字符串,也不报错,语句正常执行
GET /tehero_index/_doc/_search
{"query": {"match": {"id": {"query": "2"}}}
}
注意,如果将 id 字段的值设置为字符串 "2", 来查询,由于能够转换成整数,
这时 elastic 内部会将 字符串先转换成整数再做查询,不会报错。

ps:本想将 Full text queries 全部介绍完整的,但考虑篇幅过大,剩下的6种match查询明天再更新咯。【关注我,获取最新推送哟】

下期预告:Full text queries 【关注公众号:ZeroTeHero,系统学习ES】

待续


       

●ElasticSearch系列01:如何系统学习ES

●ElasticSearch系列02:ES基础概念详解

●ElasticSearch系列03:ES的数据类型

●ElasticSearch系列04:索引和文档的CURD

●ElasticSearch系列05:倒排序索引与分词Analysis


推荐阅读
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了如何在使用emacs时去掉ubuntu的alt键默认功能,并提供了相应的操作步骤和注意事项。 ... [详细]
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
author-avatar
手机用户2502899537
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有