Elasticsearch入门

参考资料

感谢知乎上大数据梦想家分享的入门教程,很实用。教程地址:从 0 到 1 学习 elasticsearch ,这一篇就够了!(建议收藏)

Elasticsearch 是什么

Elasticsearch 简称 ES,是一个开源的高扩展的分布式全文检索引擎,可以近实时的存储、检索数据。ES 使用 Lucene 作为其核心来实现所有索引及搜索的功能,使用 RESTful API来隐藏 Lucene 的复杂性,从而使全文检索变得简单易用。

Elasticsearch 与 Solr 的比较

  • ES 和 Solr 都基于 Lucene。
  • ES 自带分布式协调管理功能,Solr 依赖 Zookeeper 进行分布式管理。
  • ES 只支持 json 格式,Solr 支持 json、XML、CSV 等格式。
  • ES 很多功能需要第三方插件支持,Solr 本身功能较为丰富。
  • ES 建立索引快,适用于实时性较强的场景;Solr 查询较快,但是索引更新慢,适用于电商等查询较多的场景。

Elastisearch 安装及启动

从官网 Download Elasticsearch 根据平台选择对应的版本进行下载。下载完成后将下载压缩包文件拷贝到安装路径(~/.opt/elasticsearch)并解压,在该目录下新建 data 目录用于存储索引。

修改配置文件 $ES_HOME/config/elasticsearch.yml 文件:

1
2
3
4
5
6
7
8
9
10
11
12
cluster.name: demo-elasticsearch
node.name: node01
path.data: ~/.opt/elasticsearch/data
path.logs: ~/.opt/elasticsearch/logs
network.host: 0.0.0.0
host.port: 9200
cluster.initial_master_nodes: ["node01"]
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12

修改 jvm.options 文件中的配置:

1
2
-Xms1g
-Xmx1g

据说 Elasticsearch 不允许使用 root 用户操作,需要新建 elsearch 用户组及 elsearch 用户进行集群的操作,但是我在 macOS 上直接使用 admin 账号操作没遇到什么问题,并且在 macOS 上新建用户组和用户和 Linux 上的命令不通用,所以跳过新建用户这一步。

启动 es:

1
bin/elasticsearch

启动之后,可以访问 http://localhost:9200 查看。如果没有关闭 xpack.security.http.ssl 配置的话,需要访问 https://localhost:9200。

这个页面会返回一些集群相关的信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name" : "node01",
"cluster_name" : "demo-elasticsearch",
"cluster_uuid" : "2pFl_UiuQFSwsGD-6CTtMQ",
"version" : {
"number" : "9.0.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "112859b85d50de2a7e63f73c8fc70b99eea24291",
"build_date" : "2025-04-08T15:13:46.049795831Z",
"build_snapshot" : false,
"lucene_version" : "10.1.0",
"minimum_wire_compatibility_version" : "8.18.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}

Elasticsearch-head 安装

Elasticsearch-head 是 Elasticsearch 的一个开源的图形化界面,在 GitHub 上可以获取:https://github.com/mobz/elasticsearch-head。将源码克隆到本地,然后通过 npm 启动。

1
2
3
4
5
cd elasticsearch-head

npm install

npm start

因为跨域的原因,需要在 elasticsearch.yml 中增加相关的配置:

1
2
http.cors.enabled: true
http.cors.allow-origin: "*"

修改配置后,重启 es,访问 http://localhost:9100,就能看到 es-head 页面了,可以查看索引和查询之类的功能。

kibana 安装

kibana 安装

kibana 可以将更友好的展示和分析 es 的数据。在 es 官网可以进行下载:https://www.elastic.co/cn/downloads/kibana,要注意的是,kibana 的版本需要和 es 的版本保持一致。

下载后放到指定路径 ~/.opt/kibana 并解压。

修改配置文件:~/.opt/kibana/config/kibana.yml:

1
2
3
4
5
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.username: "elsearch"
elasticsearch.password: "elsearch"

通过 bin/kibana 启动 kibana。

访问 http://localhost:5601 访问 kibana 页面。

ik 分词器安装

原下载地址:https://github.com/infinilabs/analysis-ik/releases,但是最新版本已不在 GitHub 更新,需要到 https://release.infinilabs.com/analysis-ik/stable/ 进行下载。

下载后拷贝到 $ES_HOME/plugins/ik 路径下,重启 kibana。

测试分词器(最少切分):梦想家

1
2
3
4
5
GET _analyze
{
"analyzer": "ik_smart",
"text": "梦想家"
}

最细粒度切分:梦想家、梦想、想家

1
2
3
4
5
GET _analyze
{
"analyzer": "ik_max_word",
"text": "梦想家"
}

分词器自定义词典:

在 $ES_HOME/plugins/ik/config 路径下新建文件 my.dic,写入需要被识别成一个词的词。

修改 IKAnalyzer.cfg.xml 文件:

1
2
3
4
5
<properties>
<comment>IK Analyzer 扩展配置</comment> <!-- 用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">my.dic</entry> <!-- 用户可以在这里配置自己的扩展停止词字典 -->
<entry key="ext_stopwords"></entry>
</properties>

修改完成保存并重启 es,此时 my.dic 中的词就不会再被切分。

Elasticsearch 基本操作

创建文档:

1
2
3
4
5
PUT /test1/_doc/1
{
"name": "大数据梦想家",
"age": 24
}

创建成功后可在 es-head 页面浏览数据标签页中看到对应的索引 test1。

创建索引并指定字段类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT /test2
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}

查看刚才创建的索引:

GET /test2

向该索引增加数据:

1
2
3
4
5
6
PUT /test2/_doc/1
{
"name": "大数据梦想家",
"age": 21,
"birthday": "2020-01-01"
}

查看文档信息:

1
GET /test2/_doc/1

修改文档:

1
2
3
4
5
6
PUT /test2/_update/1
{
"doc": {
"name": "大数据梦想家1"
}
}

修改文档也可以使用和新增同样的方式进行,但是会覆盖元来的数据,不推荐使用。

删除文档:

1
DELETE /test2/_doc/1

删除索引:

1
DELETE /test2

查找

先增加几条测试数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
PUT /demo/_doc/1
{
"name": "爱丽丝",
"age": 21,
"desc": "在最美的年华,做最好的自己",
"tags": ["技术宅", "温暖", "思维活跃"]
}

PUT /demo/_doc/2
{
"name": "鲍勃",
"age": 25,
"desc": "逍遥自在",
"tags": ["交友", "理性"]
}

PUT /demo/_doc/3
{
"name": "露西",
"age": 30,
"desc": "人越讨厌明天,就睡得越晚",
"tags": ["社会", "科学"]
}

PUT /demo/_doc/4
{
"name": "Alice爱学Python",
"age": 21,
"desc": "人生苦短,我用Python",
"tags": ["好学", "勤奋刻苦"]
}

PUT /demo/_doc/5
{
"name": "Alice爱学Java",
"age": 18,
"desc": "技术成就自我",
"tags": ["思维敏捷", "喜欢学习"]
}

按 name 查找,返回 name、age、desc 列,结果按 age 升序排序,从第二个结果开始返回1个结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GET /demo/_search
{
"query": {
"match": {
"name": "爱丽丝"
},
"_source": ["name", "age", "desc"],
"sort": [{
"age": {
"order": "asc"
}
}],
"from": 1,
"size": 1
}
}

OR:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
GET /demo/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "爱丽丝"
}
},
{
"match": {
"age": 25
}
}
]
}
}
}

AND:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
GET /demo/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "爱丽丝"
}
}
],
"filter": [
{
"range": {
"age": {
"lte": 18
}
}
}
]
}
}
}

按多个值查找:

1
2
3
4
5
6
7
8
GET /demo/_search
{
"query": {
"match": {
"tags": "男 学习"
}
}
}

text 字段在查找时会被先被分词然后再进行查找,keyword 类型的字段会进行精确查找,不会被分词。

对结果进行高亮显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET /demo/_search
{
"query": {
"match": {
"name": "鲍勃"
}
},
"highlight": {
"pre_tags": "<b class='key' style='color: red'>",
"post_tags": "</b>",
"fields": {
"name": {}
}
}
}

关于分词:

  • term:不经过分词,直接查询精确的值
  • match:会使用分词器解析
1
2
3
4
5
6
7
8
GET /demo/_search
{
"query": {
"term": {
"name": "爱"
}
}
}

查看健康信息

1
GET _cat/health
1
GET _cat/indicies?v