ElasticSearch
概念
ES是一款分布式全文搜索引擎,基于Lucene,进行了二次封装,更容易上手。
安装
安装es
- 下载官网
- 解压
- 启动 ./bin/elasticsearch.bat
- 访问 127.0.0.1:9200
安装Elastic-head
这里采用Docker安装
docker run -p 9100:9100 mobz/elasticsearch-head:5
可能需要设置允许跨域,参考官方
http.cors.enabled: true
http.cors.allow-origin: "*"
再一个如果不在一台主机可能需要修改主机地址
/usr/src/app/_site/app.js 内 配置了主机地址,修改为实际的地址
安装Kibana
- 下载,尽量与ES版本一致
- 解压,运行
- 使用开发控制台
- 设置中文
kibana.yml中 修改为
i18n.locale: “zh-CN”
倒排索引
参考
其本质是对文档进行关键词(又称单词)提取并保存其出现频次,所在文档,出现位置等等信息,放入一条记录;所有记录组成了单词词典。
查询时,直接根据关键字去索引对应的文档,然后根据一系列权重算法进行排序。
而这种索引的形式就称为倒排索引。
在倒排索引中,分词就显得很重要。
分词器
- 概念:将一句话拆分成一些合理的词,ES默认的分词器中,会将中文的每个字解析成一个词,不具有意义,需要安装合乎汉语语义的分词器。
IK分词器
Ik分词器提供了两个分词算法:ik_smart(简单拆分,仅仅按字典做拆分),ik_max_word(连续的一个或多个有含义的多个字都会拆成一个词)
明显,max比smart分词更多,词典更大,占用内存更多,更准确
- 下载ik分词器(注意ES版本一致)
github - 解压至对应es的plugins目录下
- 重启es即可
ES命令
elasticsearch-plugin
E:\es\elasticsearch-7.16.3\bin>elasticsearch-plugin --help
A tool for managing installed elasticsearch plugins
Commands
list - Lists installed elasticsearch plugins #es当前已加载的插件列表
install - Install a plugin #在es中安装一个插件
remove - removes plugins from Elasticsearch #从当前es中移除一个插件
Non-option arguments:
command
Option Description
-E Configure a setting
-h, --help Show help
-s, --silent Show minimal output
-v, --verbose Show verbose output
测试
基于Kibana控制台测试
- 使用 ik_smart 算法对指定文本分词
GET _analyze
{
"analyzer": "ik_smart",
"text": [
"name","小明","我的你的","单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针眼。"
]
}
以最后三个字为例
smart 分词会分为:
{
"token" : "指",
"start_offset" : 102,
"end_offset" : 103,
"type" : "CN_CHAR",
"position" : 49
},
{
"token" : "针眼",
"start_offset" : 103,
"end_offset" : 105,
"type" : "CN_WORD",
"position" : 50
}
而 max_word 分词会分为
{
"token" : "指针",
"start_offset" : 102,
"end_offset" : 104,
"type" : "CN_WORD",
"position" : 57
},
{
"token" : "针眼",
"start_offset" : 103,
"end_offset" : 105,
"type" : "CN_WORD",
"position" : 58
}
自定义词汇
场景
当分词器没有按预期的结果进行分词时,我们可以自定义词语并扩展到词典中。
扩展ik分词器
- 在 IKAnalyzer.cfg.xml 配置文件中配置自己的词典
- 然后在对应目录(这里就是当前目录)创建对应的文件,每行表示一个词
在添加自定义词典之前
最大分词也不能分出 气很这个词,在添加后即可分出该词汇(smart和max_word都可以)