全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。
它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。
Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
环境配置
基础概念
-
Node 与 Cluster
Elastic本质是分布式集群数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。
-
Index (数据库的同义词)
索引实际上是指向一个或者多个物理 分片 的 逻辑命名空间 。
名字必须小写,不能以下划线开头,不能包含逗号
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
1
http://localhost:9200/_cat/indices?v
-
Type (表-分组)
是虚拟的逻辑分组,用来过滤 Document。
命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符
不同的 Type 应该有相似的结构(schema),举例来说,
id
字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。1
http://localhost:9200/_mapping?pretty=true
-
Document (记录)
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的
-
文档元数据
_index:文档在哪存放
_type:文档表示的对象类别
_id:文档唯一标识
-
交互
客户端都是通过 9300 端口并使用 Elasticsearch 的原生 传输 协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群。
- 节点客户端
不存储数据, 只存储数据在集群中的哪个节点中
- 传输客户端
将请求发送到远程集群,可以将请求转发到集群中的一个节点上。
-
RESTful API
使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信
基础操作
创建索引
1 |
PUT请求 |
数据插入
插入时索引不存在默认创建索引和类型
1 |
# 指定文档id(相同id更新整个文档) |
数据修改
1 |
# 文档修改 |
在集群环境下, 同时更新同一条文档, 出现冲突,Elasticsearch使用乐观并发控制更新将会失败。应用程序接下来将决定该如何解决冲突。
数据删除
1 |
# 删除文档 |
数据查询
Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。
1 |
GET请求 |
查询结果
took
: 操作的耗时(单位为毫秒)hits
: 命中的记录total
:返回记录数max_score
:最高的匹配程度hits
:返回的记录组成的数组