黄金龙的博客

从零开始使用elasticsearch

前言

网上关于elasticsearch内容不少,但是系统介绍使用的文章却很少,本文章将从零开始系统的介绍elasticsearch使用,包括部署,建立索引,建立文档等一系列相关操作,一些通用的概念(可直接搜索得到的结果)不在本文讨论的范围,会基于spring-data-elasticsearch介绍如何实际使用,关于这部分通过百度搜索得到的结果基本全错,主要原因是版本差异造成的。

elasticsearch适用范围

应用搜索,快速索引到相关内容,基于地理位置的搜索,大数量的分布式搜索,因为天然支持分布式,所以应用层面很广,值得学习使用。官方中文帮助文档(版本比较老,部分操作可能会报错)

部署启动

选择合适elasticsearch版本
比如我们使用spring-data-elasticsearch,那么需要选择正确对应版本,否则容易产生难以预料的问题,不同版本api版本差异较大,但是基本概念不变,本文基于6.2.2版本进行讲解
下载完成elasticsearch之后就可以直接进入bin目录启动:./elasticsearch -d

配置文件

部署启动之后直接访问http://localhost:9200就可以返回结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name" : "WKxePlc",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "RgKKFX61Q7GSuLlLE91r4g",
"version" : {
"number" : "6.2.2",
"build_hash" : "10b1edd",
"build_date" : "2018-02-16T19:01:30.685723Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}

elasticsearch默认启动只能本地访问,如果想要提供给局域网或者外网访问,修改config/elasticsearch.yml文件,增加如下内容:

1
2
3
4
5
6
# 配置当前ip,ip可以有内网外网之分,0.0.0.0表示不区分
network.host: 0.0.0.0
# 是否跨域,配置为true那么其他服务器可以访问
http.cors.enabled: true
# 可以针对固定ip进行访问,*表示不限制,谁都能访问该服务
http.cors.allow-origin: "*"

在某些定制的linux系统下可能会提示一些错误,大概意思是程序会判断系统的具体的版本来分配运行内存,定制的系统下可能无法判断结果,也就无法分配运行内存,只能不限制内存。其他常规错误可以直接搜索得到解决方法。

安装配套工具kibana

因为官方文档给的各种操作都是基于此工具,所以我们按照官方提示来,当然也可以直接使用curl工具或者可视化的postman也能得到相同的结果
https://www.elastic.co/downloads/past-releases还是这个地址选择kibana合适版本下载,进入bin目录启动./kibana

基本使用

存入一条记录需要先建立一个索引,索引里面再建立一个类型。索引可以理解为数据库中的表,类型可以理解为数据库中的表,文档则对应数据表中的记录
为了详细讲述此部分内容,我们实际操作一些简单数据
先建立一个索引(以下内容均基于kinaba开发工具)

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
PUT /search
{
"mappings": {
"content": {
"properties": {
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"name": {
"type": "keyword"
},
"type": {
"type": "long"
}
}
}
},
"settings": {
"index": {
"refresh_interval": "-1",
"number_of_shards": "5",
"store": {
"type": "fs"
},
"number_of_replicas": "1"
}
}
}

PUT /search 表示创建一个名为search的索引,分为两部分mapping跟setting。setting表示该索引的设置,更多setting设置可以参考官方文档。mapping表示对应的类型,这里我们建一个content类型,有id、name、type三个字段。type可以选择keyword跟text,他们之间的区别是text会自动进行英文分词,如果需要中文分词还要单独设置插件,keyword则不进行分词。如果分词,那么搜索会进行单词的拆分搜索。
插入几条测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PUT /search/content/1
{
"id": "1",
"name": "test1",
"type": 1
}
PUT /search/content/2
{
"id": "2",
"name": "test2",
"type": 2
}
PUT /search/content/3
{
"id": "3",
"name": "test3",
"type": 3
}

插入数据可能不会立马查出来,如果需要立即刷新,那么在请求后面增加?refresh=true,对于实时性不强的数据不建议增加该参数,这样会导致性能不佳
简单查询数据

1
GET /search/content/_search?q=name:test1

当然我们也可以通过传参数得到数据,类似的

1
2
3
4
5
6
7
8
GET /search/content/_search
{
"query": {
"prefix": {
"name": "test"
}
}
}

安装插件

比较常用的插件

  • elasticsearch-head
  • elasticsearch-analysis-ik
  • elasticsearch-analysis-pinyin