ElasticSearch学习
本文最后更新于:3 年前
这是ElasticSearch技术的相关学习嗷!
ES概述:
- 开源的高拓展的分布式全文搜索i引擎
安装:
Windows版本是一个zip,解压缩就能用嗷!!!
bin中有一个.bat文件:

和JMeter一样,解压缩就能够使用嗷!!!
启动结果:

1 | |
- 可能出现的问题以及解决措施:

- JSON中的集合可以使用[],并且在其中列出每一个元素来表示嗷!!!
基本概念:
- 类比:

- 倒排索引:
和正向索引相对应
what is 正向索引?
通过主键关联文章,在文章中去一个个查对应的值
what is 倒排索引?
将查询关键字和主键关联,从而建立和文章的关联



这样找某个关键词就不用扫描所有的行去获得,直接根据我们记录的倒排列表,找到列表中对应的行,然后查找对应的行就行了嗷!!!
倒排索引创建索引的流程:
1) 首先把所有的原始数据进行编号,形成文档列表
2) 把文档数据进行分词,得到很多的词条,以词条为索引。保存包含这些词条的文档的编号信息。
搜索的过程:
当用户输入任意的词条时,首先对用户输入的数据进行分词,得到用户要搜索的所有词条,然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
然后根据这些编号去文档列表中找到文档
作者:喔喔牛
链接:https://www.zhihu.com/question/23202010/answer/254503794
来源:知乎
索引操作:
- 对比关键型数据库,创建索引等同于创建数据库嗷!!!

PUT创建索引:

Put请求具有幂等性,就是反复提交都是一样的结果,没有影响嗷!!!

Post请求在这种情况下无法使用嗷!!!

GET获得索引信息:

如果想要查看所有的索引,也是GET,但是就要使用特殊路径了嗷!!!

http://127.0.0.1:9200/_cat/indices?v
DELETE删除索引:

再去查看索引信息:

发现被成功删除了嗷!!!
文档操作:
POST创建文档:

下面这个id是唯一标识嗷,同样的请求发出之后,id会有不同。因此POST请求不是幂等性的嗷!!!PUT不行,因为PUT是幂等性的操作!!!

- 自定义ID如何进行:

这样每次返回值就是一样的了嗷!!!这是啥???这是幂等性操作!!!我们再来试试PUT!!!成功了!!!

- 并且上面这种方式,使用PUT也能够成功CREAT嗷!!!

GET获得文档信息:

这个_id就类似于我们的主键嗷!!!
如果查不到的话下面那个found就会为false
如果想要查找所有文档数据呢?

PUT更新文档信息:


- 上面这种称之为全量数据的更新
- 更新局部的数据,每次更新结果是不一样的,不符合幂等性,因此用POST请求嗷!!!

注意地址中间是update嗷!!!

DELETE删除文档:

不能够重复删除嗷!!!

条件查询:
分页查询和排序等:

- 上面的请求参数不好加哈,而且容易乱码,写到请求体中

- 全部查询:

- 分页查询方式:

上面这个就是分页查询,从第几页开始,查多少条记录这种嗷!!!
至于这个分页的情况下,页码的计算公式如下:

这种方式就能够非常方便的计算出我们现在的那条数据在第几页嗷!!!
- 过滤数据源,只显示某些字段:

在JSON中添加对应的字段的指定嗷!!!
- 甚至可以对于特定的字段排序:

用什么排序,以及怎么排序嗷!!!
范围查询和逻辑连接等:
上面match中的就是条件,例如”_source”中的category等,限制它们匹配等。
相当于逻辑判断中的and
- 那么如果想用逻辑判断中的or呢?

- 范围的查询:
再多加上一个条件嗷!!!

完全匹配和高亮显示等:
- 在保存文档数据的时候,ElasticSearch会自动对于文档进行分值拆解工作,将拆解后的数据保存在倒排索引当中。即使使用文字的一部分也能够成功查询到数据。

- ES查询的时候也会将我们查询的内容分解,然后去索引中找到对应的值进行匹配。导致”小华“,既可以查到小米,又可以查到华为嗷!!!这个肯定是有问题的!!!
- 那么如何进行完全匹配呢?

- 高亮显示如何做到呢?

聚合查询:
- 分组统计:


- 平均值:

- 创建Mapping:


查询验证:



Java操作ES:
- 建立项目
- POM
- 测试
索引操作:
连接测试:
1 | |
创建索引:
1 | |
查询索引:

1 | |
- 这里其实就获取到了对应的属性嗷!!!
删除索引:
1 | |
- summary:
- 构建对应操作的Request
- 利用client发送到ES,并获得对应的返回结果Response
- 分析Response
文档操作:
插入数据:
1 | |
更新数据:
1 | |

查询数据:
1 | |
删除数据:
1 | |
批量更新&批量删除:
1 | |
1 | |
高级查询:
全量查询:
1 | |
- 准备工作先插入数据嗷!!!
- 下面就是查询代码:
1 | |
条件查询:
1 | |
- 实际上就是构造的query条件不一样而已嗷!!!
分页查询:
1 | |
查询排序:
1 | |
- 本质上就是设置builder,然后将对应设置好的builder添加到request中嗷!!!通过request去执行嗷!!!有点像定制化装配builder,然后request带去执行的感觉嗷!!!
字段过滤:
1 | |
组合查询:
1 | |
范围查询:
1 | |
- 最大的builder是SearchSourceBuilder
- 下面还有类似于BoolQueryBuilder和RangeQueryBuilder等下属builder
- 设置完对应的条件之后,再整体组装为大的builder即可实现不同的功能嗷!!!
模糊查询:
- 讲的太乱了,后面补上,服了这个老师了。
