Elasticsearch介绍与安装

By youfang

Elasticsearch

介绍

Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。

为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。

  • 一个分布式的实时文档存储,每个字段可以被索引与搜索;
  • 一个分布式实时分析搜索引擎;
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

ELK(Elasticsearch + Logstash + Kibana)

Elasticsearch Kibana 官方下载地址

  • Elasticsearch是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

    Elasticsearch下载地址

  • Kibana是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。

    Kibana下载地址

  • Logstash是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。

    Logstash下载地址

华为云的镜像去下载,速度很快,自己找对应版本就可以

注意的地方

Elasticsearch并不支持事务。

安装与使用

一、运行

  1. 安装JDK
  2. 下载和解压缩安装包(ELK)
  3. 启动Elasticsearch:bin\elasticsearch.bat
  4. 检查ES是否启动成功:http://localhost:9200
  5. 启动Kibana:bin\kibana.bat
  6. 检查Kibana启动成功:http://localhost:5601
    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
    name: node名称
    cluster_name: 集群名称(默认的集群名称就是elasticsearch)
    version.number: 5.2.0,es版本号
    {
    "name" : "4onsTYV",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "nKZ9VK_vQdSQ1J0Dx9gx1Q",
    "version" : {
    "number" : "5.2.0",
    "build_hash" : "24e05b9",
    "build_date" : "2017-01-24T19:52:35.800Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.0"
    },
    "tagline" : "You Know, for Search"
    }
    5、修改集群名称:elasticsearch.yml
    6、下载和解压缩Kibana安装包,使用里面的开发界面,去操作elasticsearch,作为我们学习es知识点的一个主要的界面入口
    7、启动Kibana:bin\kibana.bat
    8、进入Dev Tools界面
    9、GET _cluster/health

    集群信息:
    GET _cat/health?v
    查看集群中有哪些索引:
    GET _cat/indices?v


    PUT /test_index?pretty

Kibana汉化

文件位置:E:\developer\es\kibana-7.9.1\x-pack\plugins\translations

修改:E:\developer\es\kibana-7.9.1\configkibana.yml

1
2
3
# Specifies locale to be used for all localizable strings, dates and number formats.
# Supported languages are the following: English - en , by default , Chinese - zh-CN .
i18n.locale: "zh-CN"

二、中文分词

首先,安装中文分词插件。这里使用的是IK

  1. 下载最新版下载地址
  2. cd your-es-root/plugins/ && mkdir ik
  3. 解压文件至:your-es-root/plugins/ik
  4. 检查命令:E:\developer\es\elasticsearch-7.9.1\bin>elasticsearch-plugin list

三、Elasticsearch Head

Elasticsearch集群的Web前端

需要预先配置: Enable CORS in elasticsearch
配置文件:elasticsearch-7.9.1\config\elasticsearch.yml

1
2
http.cors.enabled: true
http.cors.allow-origin: "*"
  1. git clone git://github.com/mobz/elasticsearch-head.git
  2. cd elasticsearch-head
  3. npm install
  4. npm run start
  5. open http://localhost:9100/

概念

  • 索引(Index)
      Elasticsearch 数据管理的顶层单位就叫做 Index(索引),相当于关系型数据库里的数据库的概念。另外,每个Index的名字必须是小写。

  • 文档(Document)
      Index里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示。同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

  • 类型(Type)
      Document 可以分组,比如employee这个 Index 里面,可以按部门分组,也可以按职级分组。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document,类似关系型数据库中的数据表。
      不同的 Type 应该有相似的结构(Schema),性质完全不同的数据(比如 products 和 logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

  • 文档元数据(Document metadata)
      文档元数据为_index, _type, _id, 这三者可以唯一表示一个文档,_index表示文档在哪存放,_type表示文档的对象类别,_id为文档的唯一标识。

  • 字段(Fields)
      每个Document都类似一个JSON结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个 Document,可以类比关系型数据库数据表中的字段。

ElasticSearch Solr 对比

  1. ES解压就能用,solr安装复杂
  2. solr利用zookeeper进行分布式管理,es自带分布式协调
  3. solr支持更多格式,es只支持json
  4. solr官方提供功能跟多,es更专注核心功能,高级功能有第三方插件提供
  5. solr查询快,更新索引(插入、删除)慢。es建立索引快,实时性查询快

直接ES 不解释。

系列教程

概念

面向文档

1
2
3
4
索引              ->      数据库
字段类型(mapping) -> 表
行 -> 文档
fields -> 字段(columns)

一个人就是一个集群

倒排索引:

采用lucene倒排索引作为底层,这种结构适用于快速的全文搜索,一个elasticsearch索引是由多个lucene索引组成。

是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。(含有关键词的文档列表)
它是文档检索系统中最常用的数据结构。
通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

之前的文档(废弃)

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
PUT /test_index?pretty  //新增索引
DELETE /test_index //删除索引
1、 新增数据
PUT /ecommerce/product/1
{
"name": "gao lu jie yagao",
"desc": "gaoxiao meibai",
"price": 10,
"tags": ["meibai","fangzhu"]
}
PUT /ecommerce/product/2
{
"name": "jia jie shi yagao",
"desc": "youxiao fangzhu",
"price": 20,
"tags": ["meibai","fangzhu"]
}
PUT /ecommerce/product/3
{
"name": "yun nan bai yao",
"desc": "caoben baohu",
"price": 30,
"tags": ["zhongyao","fangzhu"]
}
ES会自动创建index和type,不需要提前创建,而且ES默认会Document每个field都建立倒排索引,让其可以被搜索。
2、 查询(检索文档):
GET /index/type/id
GET /ecommerce/product/3
3、 修改(修改文档):
1. 替换方式(必须带上所有的filed)
PUT /ecommerce/product/1
{
"name": "gao lu jie",
"desc": "gaoxiao meibai",
"price": "gao lu jie product",
"tags": ["meibai","fangzhu"]
}
2. 修改指定字段方式
POST /ecommerce/product/1/_update
{
"doc": {
"name": "gaolujie (qianghuaban)"
}
}
4、 删除(删除文档):
POST /ecommerce/product/1/_update
{
"doc": {
"name": "gaolujie (qianghuaban)"
}
}
### 查询
GET /ecommerce/product/_search?q=name:shi&sort=price:desc
query DSL:特定领域的语言
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
}
}
GET /ecommerce/product/_search
{
"query": {
"match": {
"name": "yagao"
}
}
}
GET /ecommerce/product/_search
{
"query": {
"match": {
"name": "shi"
}
},
"sort": [
{
"price":"desc"
}
]
}
报错:
Fielddata is disabled on text fields by default. Set fielddata=true on [price] in order to load fiel
解决方法:
PUT ecommerce/_mapping/product/
{
"properties": {
"price": {
"type": "text",
"fielddata": true
}
}
}
分页:
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
},
"from": 1,
"size": 2
}
只查询某个字段:
GET /ecommerce/product/_search
{
"query": {
"match_all": {}
},
"_source": ["name","price"]
}
GET /ecommerce/product/_search
{
"query": {
"bool": {
"must": [
{"match": {
"name": "yagao"
}}
],
"filter": {
"range": {
"price": {
"gte": 35
}
}
}
}
}
}
全文模糊检索
GET /ecommerce/product/_search
{
"query": {
"match": {
"name": "yagao productor"
}
}
}
全匹配检索
GET /ecommerce/product/_search
{
"query": {
"match_phrase": {
"producer": "yagao productor"
}
}
}
高亮
GET /ecommerce/product/_search
{
"query": {
"match": {
"producer": "producer"
}
},
"highlight": {
"fields": {
"producer":{}
}
}
}