[ES]一基础|正排索引和倒排索引 | ES和MySQLd的对比 | 默认分词器 | IK分词器 | 扩展、停用ik分词器的词库

本文主要是介绍[ES]一基础|正排索引和倒排索引 | ES和MySQLd的对比 | 默认分词器 | IK分词器 | 扩展、停用ik分词器的词库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考 https://www.bilibili.com/video/BV1b8411Z7w5?p=6

一、正排索引和倒排索引

1、ES采用倒排索引

1)文档(document):每条数据就是一个文档,在mysql中一个文档就是一条数据,在网页中,一个文档就是一个网页

2)词条(term):文档按照语义分成的词语(中文的话按照中文的词分、英语按照英文分)

3)存储过程:将文档从第一行开始,一行一行的进行分词,存成两个字段:词条和文档id,出现过的词条只要追加文档id即可。词条是唯一的,绝对不会重复,然后为词条创建索引。

4)查询过程:搜索华为手机,先对用户输入的内容进行分词,拿着词条去倒排索引中进行查询,因为所有的词条都已经建立索引,所以查询速度很快。查询"华为"得到文档id2和3,查询手机得到文档id1和2,因此可知道2号文档两个词条都包含。1和3文档只包含一个词。之后拿着id去查询文档。将文档放到结果集中。

查询一共进行了两次检索:第一次根据用户输入的词条去词条列表找到对应的文档id,第二次拿着文档id找文档。但每次都经过索引进行查询,查询效率比较高。

5)正向索引与倒排索引

正向索引一行一行的从上到下遍历文档,通过文档中找词。

倒排索引先找到词条对应的id,再去找文档,是通过词找文档。

 二、ES和MySQL的对比

1、格式不同:ES的每行数据以json串的格式进行存储。

2、索引(index):相同类型的文档的集合。相当于MySQL中的表。

3、映射(mapping):索引中文档的字段约束信息,类似表中字段和字段的数据类型。

4、MySQL和ES的对比

三、分词器

1、默认分词器(analyzer)

可选的有standard、english、chinese但是他们的中文都是一个字分一个词

POST /_analyze
{"text":"胖胖and笨笨都是可爱的小猫猫","analyzer":"chinese"
}

2、ik分词器

1)安装Ik分词器

[ES]mac安装es、kibana、ik分词器_胖胖学编程的博客-CSDN博客

2)ik分词器有两种模式:

①ik_smart:最少切分
POST /_analyze
{"text":"胖胖and笨笨都是可爱的小猫猫","analyzer":"ik_smart"
}结果
{"tokens" : [{"token" : "胖胖","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "笨笨","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 1},{"token" : "都是","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 2},{"token" : "可爱","start_offset" : 9,"end_offset" : 11,"type" : "CN_WORD","position" : 3},{"token" : "的","start_offset" : 11,"end_offset" : 12,"type" : "CN_CHAR","position" : 4},{"token" : "小猫猫","start_offset" : 12,"end_offset" : 15,"type" : "CN_WORD","position" : 5}]
}
②ik_max_word:最细切分,切分成词之后会查看词是否还能切分,如果能则继续切分。因为切的更细所以搜索概率高,占内存多。
POST /_analyze
{"text":"胖胖and笨笨都是可爱的小猫猫","analyzer":"ik_max_word"
}结果
{"tokens" : [{"token" : "胖胖","start_offset" : 0,"end_offset" : 2,"type" : "CN_WORD","position" : 0},{"token" : "笨笨","start_offset" : 5,"end_offset" : 7,"type" : "CN_WORD","position" : 1},{"token" : "都是","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 2},{"token" : "可爱","start_offset" : 9,"end_offset" : 11,"type" : "CN_WORD","position" : 3},{"token" : "的","start_offset" : 11,"end_offset" : 12,"type" : "CN_CHAR","position" : 4},{"token" : "小猫猫","start_offset" : 12,"end_offset" : 15,"type" : "CN_WORD","position" : 5},{"token" : "小猫","start_offset" : 12,"end_offset" : 14,"type" : "CN_WORD","position" : 6},{"token" : "猫猫","start_offset" : 13,"end_offset" : 15,"type" : "CN_WORD","position" : 7}]
}

四、IK分词器的扩展和停用词典

1、例子

扩展词典:米哈游和原神都没有被识别为词,因为ik词典里没有这些词。

停用词典:而“的”、“了”又没有必要分词。还有一些禁词,违禁品、国家领导人这种都应该被禁掉。

POST /_analyze
{"text":"米哈游的原神太牛皮了","analyzer":"ik_max_word"
}{"tokens" : [{"token" : "米","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "哈","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "游","start_offset" : 2,"end_offset" : 3,"type" : "CN_CHAR","position" : 2},{"token" : "的","start_offset" : 3,"end_offset" : 4,"type" : "CN_CHAR","position" : 3},{"token" : "原","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 4},{"token" : "神","start_offset" : 5,"end_offset" : 6,"type" : "CN_CHAR","position" : 5},{"token" : "太","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 6},{"token" : "牛皮","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 7},{"token" : "了","start_offset" : 9,"end_offset" : 10,"type" : "CN_CHAR","position" : 8}]
}

2、扩展、停用ik分词器的词库

1)编辑IKAnalyzer.cfg.xml 

进入docker的命令行,运行:

cd /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.12.1/config
vi IKAnalyzer.cfg.xml 

添加这两块 

2)编辑ext.dic、stopword.dic

在当前路径下创建ext.dic

 vi ext.dic
添加:
米哈游
原神

编辑stopword.dic(该文件本身就存在),添加:了、的 (如果添加的文件cat还是乱码,就自己创建一个同名文件,把原来的字段粘贴进去,再添加自己的字段)

3)重启es

4)测试

POST /_analyze
{"text":"米哈游的原神太牛皮了","analyzer":"ik_smart"
}结果:
{"tokens" : [{"token" : "米哈游","start_offset" : 0,"end_offset" : 3,"type" : "CN_WORD","position" : 0},{"token" : "原神","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 1},{"token" : "太","start_offset" : 6,"end_offset" : 7,"type" : "CN_CHAR","position" : 2},{"token" : "牛皮","start_offset" : 7,"end_offset" : 9,"type" : "CN_WORD","position" : 3}]
}

这篇关于[ES]一基础|正排索引和倒排索引 | ES和MySQLd的对比 | 默认分词器 | IK分词器 | 扩展、停用ik分词器的词库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274806

相关文章

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p