跳转至

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

GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.

安装插件

./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有点像