ElasticSearch(四)查询、分词器
正向索引
正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护;因为索引是基于文档建立的,若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
尽管正排表的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。
倒排索引
倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。
由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。在全文检索中,检索的快速响应是一个最为关键的性能,而索引建立由于在后台进行,尽管效率相对低一些,但不会影响整个搜索引擎的效率。
正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)。
文档内容:
| 
 序号  | 
 文档内容  | 
| 
 1  | 
 小俊是一家科技公司创始人,开的汽车是奥迪a8l,加速爽。  | 
| 
 2  | 
 小薇是一家科技公司的前台,开的汽车是保时捷911  | 
| 
 3  | 
 小红买了小薇的保时捷911,加速爽。  | 
| 
 4  | 
 小明是一家科技公司开发主管,开的汽车是奥迪a6l,加速爽。  | 
| 
 5  | 
 小军是一家科技公司开发,开的汽车是比亚迪速锐,加速有点慢  | 
倒排索引会对以上文档内容进行关键词分词,可以使用关键次直接定位到文档内容。
| 
 单词ID  | 
 单词  | 
 倒排列表docId  | 
| 
 1  | 
 小  | 
 1,2,3,4,5  | 
| 
 2  | 
 一家  | 
 1,2,4,5  | 
| 
 3  | 
 科技公司  | 
 1,2,4,5  | 
| 
 4  | 
 开发  | 
 4,5  | 
| 
 5  | 
 汽车  | 
 1,2,4,5  | 
| 
 6  | 
 奥迪  | 
 1,4  | 
| 
 7  | 
 加速爽  | 
 1,3,4  | 
| 
 8  | 
 保时捷  | 
 2,3  | 
| 
 9  | 
 保时捷911  | 
 2  | 
| 
 10  | 
 比亚迪  | 
 5  | 
高级查询:
根据id进行查询
GET /mymayikt/user/12
查询当前所有类型的文档
GET /mymayikt/user/_search
根据多个ID批量查询
查询多个id分别为1、2
GET /mymayikt/user/_mget
{
"ids":["1","2"]
}
复杂条件查询
查询年龄为年龄21岁
GET /mymayikt/user/_search?q=age:21
查询年龄30岁-60岁之间
GET /mymayikt/user/_search?q=age[30 TO 60]
注意:TO 一定要大写
查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据
GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1
查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据,展示name和age字段
GET /mymayikt/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1&_source=name,age
Dsl语言查询与过滤
什么是DSL语言
  es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
  DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
Term与Match区别:
Term查询不会对字段进行分词查询,会采用精确匹配。
Match会根据该字段的分词器,进行分词查询。
根据名称精确查询姓名(term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇):
GET mymayikt/user/_search
{
"query": {
"term": {
"name": "xiaoming"
}
}
}
根据汽车名称模糊查询(match查询相当于模糊匹配,只包含其中一部分关键词就行)
GET /mymayikt/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": { "car": "奥迪"
}
}
}
使用filter过滤年龄
GET /mymayikt/user/_search
{
"query": {
"bool": {
"must": [{
"match_all": {}
}],
"filter": {
"range": {
"age": {
"gt": 21,
"lte": 51
}
}
}
}
},
"from": 0,
"size": 10,
"_source": ["name", "age"]
}
分词器:
因为Elasticsearch中默认的标准分词器分词器对中文分词不是很友好,会将中文词语拆分成一个一个中文的汉子。因此引入中文分词器-es-ik插件。
一、传统分词器演示:
http://192.168.212.181:9200/_analyze
//请求:
{
"analyzer": "standard",
"text": "奥迪a4l"
} //查询结果
{
"tokens": [
{
"token": "奥",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
},
{
"token": "迪",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "a4l",
"start_offset": 2,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 2
}
]
}
二、IK分词插件
下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意: es-ik分词插件版本一定要和es安装的版本对应
第一步:下载es的IK插件,名改为ik.zip(上传时候是上传ik为名的文件夹)
第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins
第三步: 重启elasticsearch即可
http://192.168.212.181:9200/_analyze
//请求
{
"analyzer": "ik_smart",
"text": "奥迪"
} //查询结果
{
"tokens": [
{
"token": "奥迪",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "a4l",
"start_offset": 2,
"end_offset": 5,
"type": "LETTER",
"position": 1
}
]
}
  三、自定义扩展字典
(1)、在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下
(2)、vi custom/new_word.dic(先在config目录中建custom文件夹,把要修改的文件放到该文件夹中,后再IKAnalyzer.cfg.xml中进行设置)
老铁
王者荣耀
洪荒之力
共有产权房
一带一路
余胜军
(3)、vi IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">custom/new_word.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
ElasticSearch(四)查询、分词器的更多相关文章
- 【自定义IK词典】Elasticsearch之中文分词器插件es-ik的自定义词库
		
Elasticsearch之中文分词器插件es-ik 针对一些特殊的词语在分词的时候也需要能够识别 有人会问,那么,例如: 如果我想根据自己的本家姓氏来查询,如zhouls,姓氏“周”. 如 ...
 - 沉淀再出发:ElasticSearch的中文分词器ik
		
沉淀再出发:ElasticSearch的中文分词器ik 一.前言 为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...
 - Elasticsearch之中文分词器插件es-ik(博主推荐)
		
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch之中文分词器 Elasti ...
 - Elasticsearch之中文分词器插件es-ik的自定义热更新词库
		
不多说,直接上干货! 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...
 - 如何给Elasticsearch安装中文分词器IK
		
安装Elasticsearch安装中文分词器IK的步骤: 1. 停止elasticsearch 2.2的服务 2. 在以下地址下载对应的elasticsearch-analysis-ik插件安装包(版 ...
 - Elasticsearch之中文分词器
		
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch的中文分词器 1.单字分词 ...
 - elasticsearch安装中文分词器插件smartcn
		
原文:http://blog.java1234.com/blog/articles/373.html elasticsearch安装中文分词器插件smartcn elasticsearch默认分词器比 ...
 - windows下elasticsearch安装ik分词器后无法启动
		
windows下elasticsearch安装ik分词器后启动报如下图错误: 然后百度说是elasticsearch路径有空格,一看果然我的路径有空格,然后重新换个路径就好了.
 - ElasticSearch安装中文分词器IKAnalyzer
		
# ElasticSearch安装中文分词器IKAnalyzer 本篇主要讲解如何在ElasticSearch中安装中文分词器IKAnalyzer,拆分的每个词都是我们熟知的词语,从而建立词汇与文档 ...
 - ElasticSearch最全分词器比较及使用方法
		
介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开 ...
 
随机推荐
- 洛谷 CF1012C Hills (动态规划)
			
题目大意:有n个山丘 , 可以在山丘上建房子 , 建房子的要求是 : 该山丘的左右山丘严格的矮于该山丘 (如果有的话),你有一架挖掘机,每单位时间可以给一个山丘挖一个单位的高度,问你想要建造 1,2, ...
 - 2020年学习目标之一——emacs
			
这两天在虚机里面安装了centos7(gnome),决定后续自己的学习一直在这个里面进行,对于编辑器我最后选择了emacs,新手一枚,不过正好也算是今年的一项学习目标吧,加油! (完)
 - Solaris 11.4安装,映像包管理系统(IPS)搭建
			
文章目录 1.下载地址 2. IPS安装准备 2.1 repo包 2.1 install-repo.ksh 2.2 校验文本 3. Solaris系统安装 3.1 虚拟机软件 3.2 安装os 3.3 ...
 - 功能+自动化测试代码扫描(demo)
			
Jacoco 是一个开源的覆盖率工具.Jacoco 可以嵌入到 Ant .Maven 中,并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技术监控 Java 程序.很 ...
 - matlab添加toolbox失败的解决办法
			
matlab添加toolbox有三种方法: 1.在网上下载对应的文件,再复制到matlab安装路径中的toolbox文件夹里. 结果:失败.仍然显示不能用该模块. 2.由于笔者的学校有买正版,所以可以 ...
 - 编写优秀CSS代码的8个策略
			
编写基本的CSS和HTML是我们作为Web开发人员学习的首要事情之一.然而,我遇到的很多应用程序显然没有人花时间真正考虑前端开发的长久性和可维护性. 我认为这主要是因为许多开发人员对组织CSS / H ...
 - chrome本地调试跨域问题
			
1.关闭chrome浏览器(全部) 我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xia ...
 - day57 jQuery基础
			
目录 一.操作标签 1 位置操作 2 尺寸 3 文本操作 4 获取值操作 5 属性操作 6 获取属性的特例 7 文档处理 二.事件 1 克隆事件 2 自定义模态框 3 左侧菜单 4 回到顶部 5 输入 ...
 - 基于.NetCore3.1系列 —— 认证授权方案之授权揭秘 (下篇)
			
一.前言 回顾:基于.NetCore3.1系列 -- 认证授权方案之授权揭秘 (上篇) 在上一篇中,主要讲解了授权在配置方面的源码,从添加授权配置开始,我们引入了需要的授权配置选项,而不同的授权要求构 ...
 - Jenkins+tomcat自动发布的热部署/重启及遇到的坑解决办法
			
一.背景 公司的项目一直手动maven打包.上传服务器.关闭/开启tomcat,整个流程下来耗时耗力,虽然可以将所有流程通过shell脚本一次性解决,但如果可以通过idea的Jenkins插件一键自动 ...