docker安装
docker进行安装Elasticsearch

1.拉取镜像
1 | docker pull elasticsearch:7.6.2 |
2.创建实例
1 | mkdir -p /docker/elasticsearch/config |
-e ES_JAVA_OPTS="-Xms256m -Xmx512m设置 ES 的初始内存和最大内存
docker进行安装Kibana

1.拉取镜像
1 | docker pull kibana:7.6.2 可视化界面 |
2.创建实例
1 | docker run --name kibana -e ELASTICSEARCH_HOSTS=http://<你的虚拟机ip>:9200 -p 5601:5601 \ |
Elasticsearch的简单使用
倒排索引机制
mysql这种就是正向索引,倒排索引就是相当于先找词,再通过词对应id去找内容
进入kibana
- 进入 <你的ip地址>:5601

基础命令
1 | GET /_cat/nodes |
1.增加
- 在 test 索引下的 filed 类型下保存 1 号数据
1
2
3
4PUT test/filed/1
{
"name": "Your Name"
}事实上POST 与 PUT都可以
POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
PUT 可以新增可以修改。从、但PUT 必须指定 id;
2.查询
- 去查询我们刚刚插入的数据
1
GET test/filed/1
- 结果:
1
2
3
4
5
6
7
8
9
10
11
12{
"_index" : "test",
"_type" : "filed",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "Your Name"
}
}
3.更新
1 | POST test/filed/1/_update |
那么这几种方式有什么不同呢?
不同:POST 操作会对比数据,如果相同不会有什么操作,文档 version 不增加,PUT 操作总会将数据重新保存并增加 version 版本;
带_update对比元数据如果一样就不进行任何操作。version有什么用?
- version 版本号 – 7之前用来做乐观锁
- seq_no 更新次数 – 7用来做乐观锁
4.删除
1 | DELETE test/filed/1 |
5.批量操作
1 | POST test/filed/_bulk |
Elasticsearch进阶
SearchAPI
ES 支持两种基本方式检索
1. 通过使用 REST request URI 发送搜索参数(uri+检索参数)
这种方式是通过在请求的查询字符串中添加搜索参数来实现的。这种方式比较简单,适合快速查询和简单的参数传递。以下是一个使用 URI 参数进行搜索的例子:
1 | GET /test_index/_search?q=name:John |
在这个例子中,/test_index/_search 是请求的路径,?q=name:John 是查询参数,表示我们想要检索索引为 test_index 中 name 字段值为 “John” 的文档。
优点:
简单易用,适合快速查询。
适合传递简单的查询参数。缺点:
查询字符串长度有限制。
对于复杂的查询,可能难以阅读和编写。
查询参数可能被URL编码,导致查询字符串复杂。
2.通过使用 REST request body 来发送它们(uri+请求体)
这种方式是通过在请求的正文(body)中发送搜索参数来实现的。这种方式可以处理复杂的查询,并且提供了更多的灵活性,尤其是对于结构化查询(如 JSON 格式的查询)。
以下是一个使用请求体发送搜索查询的例子:
1 | POST /test_index/_search |
在这个例子中,/test_index/_search 是请求的路径,请求体是一个 JSON 对象,包含了查询信息。
优点:
支持复杂的查询,包括结构化查询。
请求体是 JSON 格式,便于阅读和编写。
可以发送任何 JSON 数据,包括复杂的查询结构。缺点:
相比查询字符串,可能更复杂。
需要更多的HTTP请求体处理。
Query DSL
1. 基本语法格式
- Elasticsearch的Query DSL使用JSON格式来构建查询。基本格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"QUERY_NAME": {
"ARGUMENT": "VALUE",
"ARGUMENT": "VALUE",
// ...其他参数
}
}
对于字段特定的查询,格式如下:
{
"QUERY_NAME": {
"FIELD_NAME": {
"ARGUMENT": "VALUE",
// ...其他参数
}
}
}QUERY_NAME 是查询的类型,例如 match_all、match、match_phrase 等。
2. 检索信息
- 查询所有文档
1
2GET /test_index/_search
{ "query": { "match_all": {} } } - 返回部分字段
1
2GET /test_index/_search
{ "query": { "match_all": {} }, "_source": ["age", "balance"] }
3. Match 查询
1 | GET /test_index/_search |
Match 查询适用于字符串和基本类型,可以精确匹配或进行全文检索。
- Match_phrase 查询
1
2
3GET /test_index/_search
{ "query": { "match_phrase": { "address": "mill road" } } }
Match_phrase 查询用于短语匹配,不会对短语进行分词。 - Multi_match 查询
1
2GET /test_index/_search
{ "query": { "multi_match": { "query": "mill", "fields": ["state", "address"] } } }Multi_match 查询可以在多个字段上执行匹配。
4.Bool 查询
Bool 查询允许组合多个查询:
- must:所有条件都必须匹配。
- should:至少有一个条件匹配。
- must_not:条件必须不匹配。
1 | GET /test_index/_search |
5.Filter 查询
- Filter 查询不返回相关性分数,适用于过滤操作。
1
2GET /test_index/_search
{ "query": { "bool": { "must": [{"match": {"address": "mill"}}], "filter": {"range": {"balance": {"gte": 10000, "lte": 20000}}} } } }
6.Term 查询
- Term 查询用于精确匹配非字符串字段。
1
2GET /test_index/_search
{ "query": { "bool": { "must": [{"term": {"age": {"value": "28"}}}, {"match": {"address": "990 Mill Road"}}] } } }
7. 聚合(Aggregations)
- 聚合用于从数据中提取统计信息。
1
2GET /test_index/_search
{ "query": { "match": { "address": "mill" } }, "aggs": { "group_by_state": { "terms": { "field": "age" }
Mapping
Mapping(映射)在Elasticsearch中扮演着至关重要的角色,它定义了索引中每个字段的类型、索引方式以及其他一些行为。以下是关于Mapping的详细解释:
1. 字段类型
字段类型(Field Type)是Elasticsearch中用于指定字段数据类型的关键。常见的字段类型包括:
- keyword:适合精确匹配,如用于过滤、排序和聚合。
- text:用于全文搜索,索引时会进行分词。
- integer、long、float、double:用于数字类型的字段。
- date:用于日期类型的字段。
- boolean:用于布尔类型的字段。
- ip、geo_point、geo_shape:用于地理信息字段。
2. 映射
Mapping定义了每个字段的类型、是否被索引、是否分析以及各种其他属性。以下是一些关于映射的要点:
映射可以在创建索引时指定。
映射可以在索引创建后添加或更新,但通常建议在索引创建时完成。
映射定义了字段如何被存储和索引,包括分词器、分析器和索引选项。
1 | #查看映射信息 |
3.数据迁移
1.创建具有新映射的新索引。
2.使用 _reindex API将旧索引的数据迁移到新索引。
例如:
1 | POST _reindex |
- 对于包含多类型的旧索引,可以指定类型进行迁移:
1 | POST _reindex |
4.新版本改变
Elasticsearch 7.x及以后版本移除了type的概念,这是因为不同类型的相同字段在Lucene中会被视为同一个字段,这可能导致性能问题。以下是几个重要变化:
Elasticsearch 7.x:URL中的type参数为可选。
Elasticsearch 8.x:不再支持URL中的type参数。
为了解决这些问题,通常的做法是将索引从多类型迁移到单类型,或者将类型数据迁移到新的索引中。