ElasticSearch学习笔记¶
参考:https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
目标¶
搭建自己的全文搜索引擎
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip
下载后启动,默认占用 9200端口

启动正常
Elastic 返回一个 JSON 对象,包含当前节点、集群、版本等信息
默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,然后重新启动 Elastic。
基本概念¶
分布式 + 索引 + Document + Type
分布式¶
Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
索引¶
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
Elastic数据管理的顶层单位就叫做Index(索引),它是单个数据库的同义词,每个Index的名字必须是小写

Document¶
Index里面的单条记录,JSON格式
同一个 Index 里面的 Document,最好保持相同,这样有利于提高搜索效率
Type¶
Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
Document可以分组,这种分组叫做Type,虚拟的逻辑分组,用来过滤Document
不同的Type应该有相似的结构(schema),性质完全不同的数据应该存成两个Index,而不是一个Index里面的两个Type

新建和删除Index¶
PUT请求新建Index

DELETE请求删除Index

中文分词设置¶
需要安装中文分词插件,这里使用 ik

安装插件
./bin/elasticsearch-plugin install ik的url
重启elasticsearch 自动加载该插件
然后新建一个Index,指定需要分词的字段

user, title, desc
Elastic的分词器称为 analyzer
"user": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"}
Ik_max_word 分词器是插件ik提供的,可以对文本进行最大数量的分词
数据操作¶
新增记录¶

服务器会返回JSON对象,包含Index,Type,Id,Version等信息
请求路径中的1是该条记录的id,不一定是数字,任意字符串
新增记录的时候可以不指定id,但是需要指定POST请求

如果没有先创建Index,直接执行上面的指令,Elastic也不会报错,而是直接生成指定的Index
查看记录¶
向 /Index/Type/Id 发出GET 请求,就可以查看这条记录

Found字段表示查询成功,_source字段返回原始记录
如果id不正确,就查不到数据,found字段就是false

删除记录¶

更新记录¶

Version已经发生变化
数据查询¶
返回所有记录¶
使用 GET 方法,直接请求/Index/Type/_search,就会返回所有记录。

{
"took": 42,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "accounts",
"_type": "person",
"_id": "AYSlrYhjUOs5YOcs4ljm",
"_score": 1.0,
"_source": {
"user": "李四",
"title": "工程师",
"desc": "系统管理"
}
},
{
"_index": "accounts",
"_type": "person",
"_id": "1",
"_score": 1.0,
"_source": {
"user": "张三",
"title": "工程师",
"desc": "数据库管理,软件开发"
}
}
]
}
}
上面返回的字段中,took代表用时(单位是毫秒),time_out字段表示是否超时,hits字段表示命中的记录,里面子字段的含义如下:
total:返回记录数,本例是2条。
max_score:最高的匹配程度,本例是1.0。
hits:返回的记录组成的数组。
全文搜索¶
Elastic的查询要求GET请求带有数据体
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "软件" }}
}'

上面的代码使用Match查询,指定的匹配条件是desc字段里面包含“软件”这个词
通过size字段控制一次返回结果数量
通过from字段指定位移
逻辑运算¶
如果有多个搜索关键字,Elastic认为它们是or关系

总结¶
简单过了一遍,可以将es理解为一个分词服务,初始输入一些文本,输入关键词查询,要求es将搜索结果快速返回出来,和Redis,MongoDB有点像