docker安装es 参考博客
https://blog.csdn.net/qq_44732146/article/details/120744829
中文es文档
https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
文档元数据
一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息。 三个必须的元数据元素如下:
_index
文档在哪存放
_type
文档表示的对象类别
_id
文档唯一标识
当我们访问一个安装好的es页面的时候,应该是这个样子,ip:9200
如果我们想向es中插入一条数据,那么可以通过类似于接口工具的东西,向里面加入,交互都是json格式;那么插入文档,首先就是要了解es中文档的存储特点,即上述东西,需要有三个必须的文档原数据: 索引 文档类别 主键;
所以当我插入一条数据的时候是这样子的
https://console-docs.apipost.cn/preview/84d43b73bc307785/84bf4cfa70d4d594
其中 ecommerce/product/4 当没有索引的时候,程序会帮你自动创建
ecommerce 索引 product 相当于数据库的实体类的名称的感觉 4 主键
主键不是必传的,当没有主键的时候,es会帮助我们自动生成一个不会重复的主键
当对于同一个文档 重复通过put请求添加数据的时候,相当于是修改,看下返回结果
里面的version 为3 说明我改了两次了,resutl为updated,说明这次操作并不是增加一个数据,而是修改数据;即使修改的时候字段数据,数量没有任何变化,但是版本号,还是会随之不断增加;
多线程冲突解决:
es 中是通过乐观锁进行处理的,也就是乐观锁,上述中的版本号,相当于一个cas的过程,比对成功才会修改成功,否则会报错,尝试重新操作等;
his
返回结果中最重要的部分是 hits ,它包含 total 字段来表示匹配到的文档总数,并且一个 hits 数组包含所查询结果的前十个文档。
在 hits 数组中每个结果包含文档的 _index 、 _type 、 _id ,加上 _source 字段。这意味着我们可以直接从返回的搜索结果中使用整个文档。这不像其他的搜索引擎,仅仅返回文档的ID,需要你单独去获取文档。
每个结果还有一个 _score ,它衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score 降序排列的。在这个例子中,我们没有指定任何查询,故所有的文档具有相同的相关性,因此对所有的结果而言 1 是中性的 _score 。
还有更复杂的操作
https://www.elastic.co/guide/cn/elasticsearch/guide/current/multi-index-multi-type.html
分页查询: 就是查询所有,加入了查询条件from 从第几条开始 size 取多少条数据
http://10.0.59.161:9200/ecommerce/product/_search?size=2&from=0
倒排索引: 索引---文档列表(相似度从高到低)
安装了 es-head,终于跟es链接上了,跨域搞了半天,要进入es容器修改容器中的配置文件
添加允许跨域配置
1 进入es容器
dokcer exec -it f8 /bin/bash -- f8 容器id开头
cat ./config/elasticsearch.yml -- 打开es 配置文件
添加如下内容
http.cors.enabled: true
http.cors.allow-origin: "*"
2 进入 es-head容器
docker exec -it 【containerId】 /bin/bash
执行 find -name 'vendor.js'
并进入到所在文件夹
修改前需要在镜像中安装vim执行apt-get install vim命令若出现E: Unable to locate package vim,不要忘了执行apt-get update,重新执行 apt-get install vim
修改如下内容:
vim进入后,:6886 和:7573定位到6886行和7573行,两处,修改contentType为 application/json;charset=UTF-8
是为了将数据返回格式改为json,这样返回的数据就可以在页面解析了
修改后不用重启容器,直接去es-head网页刷新并重新搜索即可。
效果如图
可以看到搜素执行的语句,以及返回的数据以及格式
es中重要的知识: 倒排索引;
这个东西呢,逻辑上并不复杂,大概氛围两步
第一步: 存储数据,如果你想根据条件匹配数据,那么首先要把数据存入到数据库,es从数据开始存入数据库就开始了他倒排索引的准备; 例如我存入 : 你好小明 首先es会根据配置的相应分词器,将一句话拆成合理的词 例如拆成 : 你 好 你好 小明; 如上四个字,那么当有很多数据的时候,就会有重复的单词,所以要去重,然后他会记录 每个单词对应的文档id 出现次数,并以此作为条件,将每个单词的出现次数进行一个排序,排序越高越靠前,证明匹配度越高, 这个过程就是倒排索引的建立过程,相当于每个被拆分的单词都有一个索引;
第二步: 根据条件查询数据, 同样也是需要将查询条件进行分词,例如我搜索: 你还好吗 例如es拆成: 你 还好 吗; 那么 就变成了,三个单词分别去es中搜索,匹配的时候,也就是第一步中的 根据建立的索引与每个单词进行匹配,匹配度高的索引,会在前面;
下面是一个简单的分词模式, 单个单词拆分 也是standard标准模式的拆分,开下效果,我安装了kibana
安装参考地址
https://blog.csdn.net/qq_20185737/article/details/122909245
启动 kibana的时候的命令
docker run -id --name kibana -p 5601:5601 docker.io/library/kibana:7.12.0
正常国内使用,都会安装ik分词器,也就是符合中国人的单词习惯,
POST _analyze
{
"analyzer": "standard",
"text": "我好喜欢你"
}
如果改为ik,首先要安装ik 然后改动 "analyzer": "standard" 将standard 改为 ik的模式
docker 安装 ik参考
https://wenku.baidu.com/view/615bae5e32b765ce0508763231126edb6f1a7620.html
ik 与es 版本一定要一致,我的ik下载地址
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
效果如图
POST _analyze
{
"analyzer": "ik_max_word",
"text": "我好喜欢你"
}
当我们需要自定义单词的时候,不想把某个词组拆开,例如,我就需要将 我好喜欢你 变成一个不拆开的词,当这几个字,在一篇文章中的时候,我调用我的es的时候,也不允许拆开,应该怎么办呢??
自定义词组
进入docker 的 es容器;
docker exec -it dd /bin/bash -- dd 容器id开头
打开ik所在位置
cd /usr/share/elasticsearch/plugins/ik
其中有个config文件夹打开,然后查看其中的一个叫做 IKAnalyzer.cfg.xml的文件
cat IKAnalyzer.cfg.xml
可以看到这里面的每行都是对于词典的配置
我们使用其中的扩展字典
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict"></entry>
改为如下, 加入了真正的字典文件名称
<entry key="ext_dict">mydict.dic</entry>
加下来,在当前配置文件所在位置创建一个mydict.dic的文件
然后写入单词即可,每个单词一行,可参考其他文件中的内容,每个单词一行
所有以.dic结尾的都是一个单词文件,可以参考
例如我写入我的mydict.dic的内容
我好喜欢你
之后,重启es即可测试自定义单词的效果,不会再被拆分