简介:java系列技术分享(持续更新中…)
初衷:一起学习、一起进步、坚持不懈
如果文章内容有误与您的想法不一致,欢迎大家在评论区指正
希望这篇文章对你有所帮助,欢迎点赞 收藏 ⭐留言更多文章请点击
简介及安装请查看这篇
:Elasticsearch简介及安装
基于文档id创建索引,查询时先找文档,然后判断是否包含词条
正向索引
(也称为“文档索引”或“内容索引”)是将文档ID与文档内容、单词相关联的关系。这意味着可以通过文档ID获取文档的内容。在构建索引时,它的结构相对简单,建立方便且易于维护。然而,在查询时需要对所有文档进行扫描,以确保没有遗漏,这会使得检索时间大大延长,检索效率低下。
数据库Mysql采用正向索引,例如:给表中的id建立索引,如下图所示
对文档内容分词,对词条创建索引,并记录词条所在文档信息,查询时先根据词条查询文档id,然后获取文档
倒排索引
是单词到文档ID的关联关系。也就是说,通过单词可以搜索到对应的文档ID。倒排索引是搜索引擎的核心,因为它们允许我们根据关键字快速找到相关的文档。倒排索引主要由两个部分组成:单词词典(Trem Dictionary)和倒排列表(Posting List)。单词词典记录了所有的文档分词后的结果,而倒排列表则记录了单词对应文档的集合。此外,倒排索引还包含位置(Position)和偏移(Offset)信息,用于词语搜索和高亮显示。
名词介绍
:
文档(document)
: 每条数据就是一个文档词条(term)
: 文档按照语义分成的词语正向索引:
优点:
缺点:
倒排索引
优点:
缺点:
Mysq
l: 擅长事务类型操作,可以确保数据的安全性和一致性
Elasticsearch
:擅长海量数据的搜索,分析,计算
Elasticsearch
在
处理中文分词,一般会使用IK分词器GitHub地址
:https://github.com/medcl/elasticsearch-analysis-ik
ik_smart
:最少切分,粗粒度
ik_max_word
:最细切分,细粒度
较慢
# 进入容器内部
docker exec -it es /bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart es
# 查看es日志
docker logs -f es
推荐
因为根据上篇Elasticsearch简介及安装中我们知道,我们的插件数据卷为:es-plugins
docker volume inspect es-plugins
/var/lib/docker/volumes/es-plugins/_data
这个目录中。到我的主页中的资源进行下载
)放到该目录下# 重启容器
docker restart es
# 查看es日志
docker logs -f es
ik_smart 分词器
最少切分,粗粒度
ik_max_word 分词器
最细切分,细粒度
比如我想实现让上图中的text
字段的空间文化
分成一个词语
首先我们来看下ik分词器的词库如何配置
和上文中一样先查看ik分词器安装的位置
docker volume inspect es-plugins
拓展词典和停止词典在当前配置文件的所在目录 在ext.dic文件中(没有新建即可),添加想要的拓展词语即可;
docker restart es
# 查看 日志
docker logs -f es
Mapping(映射)是索引文档的约束,
例如:字段数据类型约束,等等
文档地址
:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/getting-started.html
上述有介绍其含义,例如:type为text可分词,keyword精确值也就是不可分词
put /student
{
"mappings": {
"properties": {
"info": {
"type": "text",
"analyzer": "ik_smart"
},
"email": {
"type": "keyword",
"index": false
},
"name": {
"properties": {
"firstName": {
"type": "keyword"
},
"lastName": {
"type": "keyword"
}
}
}
}
}
}
post /student/_doc/1
{
"info": "我爱学习",
"email": "[email protected]",
"name": {
"firstName": "关",
"lastName": "羽"
}
}
方式一:全量修改,会删除旧文档,添加新文档
方式二:增量修改,修改指定字段