Elasticsearch 是一个开源的分布式搜索引擎,基于 Lucene 构建,广泛应用于日志分析、全文搜索、数据分析等领域。Elasticsearch 允许我们进行高效的实时搜索和数据分析,并且其强大的分布式架构使得它能够处理大规模的数据;这篇文章介绍一下 Elasticsearch 的基本增删改查(CRUD)操作。ES 采用 RESTful
风格 API,我们可以在 Kibana
中进行相关的操作指令。
基本概念
在开始之前,我们先来了解一下 ES 当中的一些基本概念吧。
- 索引(Index):数据存储的地方,类似于关系数据库中的数据库。
- 文档(Document):索引中的数据记录,类似于关系数据库中的行。
- 字段(Field):文档中的具体数据单元,类似于关系数据库中的列。
- 映射(Mapping):定义索引中字段的数据类型和其他特性。
获取集群或者节点的信息
1 2 3 4 5 6
| # 获取集群的健康信息 GET _cluster/health # 获取节点状态信息 GET _nodes/stats # 查看所有的索引 GET /_cat/indices?v
|
CRUD
Create
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 创建一个索引,用于存储文档集合 PUT index_name # 添加文档,自动生成主键 POST index_name/_doc { "field": "value" } # 添加文档,文档 ID 由用户设置,如果文档存在,则进行覆盖 PUT index_name/_doc/document_id { "field": "value" } # 如果文档存在,则报错给出提示信息 PUT index_name/_create/document_id { "field": "value" }
|
Read
1 2
| # 根据文档id读取索引中的文档 GET index_name/_doc/document_id
|
Update
1 2 3 4 5 6 7 8
| # 更新指定文档对应的字段和内容 POST index_name/_update/document_id { "doc": { "field1": "value", "field2": "value", } }
|
Delete
1 2
| # 删除指定文档 DELETE index_name/_doc/id
|
搜索信息
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
| # 获取索引中的所有文档 GET index_name/_search # 根据区间查询 GET index_name/_search { "query": { "match": { "field": { "gte": "lowest value", "lte": "highest value" } } } } # 聚合查询 GET index_name/_search { "aggs": { "name your aggregation": { # 自己定义的分组名称 "terms": { "field": "category", # 需要进行分组的字段 "size": 100 } } } } # 全文搜索,会对 search terms 进行分词,根据分词找到匹配的数据 GET index_name/_search { "query": { "match": { "field": { "query": "search terms" } } } } # 默认情况下,分词使用 OR 进行文档匹配:如果文档出现了这个分词,就进行返回。可以将操作改成 And:一个文档中同时出现这些分词才回进行返回。 GET index_name/_search { "query": { "match": { "field you want to search": { "query": "search terms", "operator": "and" } } } } # 短语搜索,将短语当成一个整体进行完全匹配,比如匹配商品的标签 GET index_name/_search { "query": { "match_phrase": { "field": { "query": "search phreas" } } } } # 多个字段的内容数据匹配搜索,比如搜索一篇文章标题或者文章主体包含某关键字 GET index_here/_search { "query": { "multi_match": { "query": "search terms", "fields": [ "field1^2", # 可以设置搜索字段的权重(^),会排在前面优先展示 "field2", "field you want to search over" ], "type": "phrase" # 加上这行,表示短语搜索,进行全匹配 } } }
|
组合搜索查询
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
| # Bool Query - must: defines all queries(criteria) a document MUST match to be returned as hits 返回所有条件都符合的搜索结果:必需要符合条件1和条件2... GET index_name/_search { "query": { "bool": { "must": [ { "match_phrase": { "field1": "value" } }, { "match": { "field2": "value" } } ] } } } - must_not: defines queries(criteria) a document MUST NOT match to be included in the search results 符合某种条件的结果不返回 GET index_name/_search { "query": { "bool": { "must": { "match_phrase": { "field1": "value" } }, "must_not":[ # 符合这个条件的结果不返回 { "match": { "field2": "value" } } ] } } } - should: "nice to have" queries(criteria) 符合条件的结果会有更高的得分,会展示在搜索结果的更前面 GET news_headlines/_search { "query": { "bool": { "must": [ { "match_phrase": { "field1": "value" } } ], "should":[ { "match_phrase": { "field2": "value" } } ] } } } - filter: 过滤符合条件的结果 GET news_headlines/_search { "query": { "bool": { "must": [ { "match_phrase": { "field": "value" } } ], "filter":{ # 筛选出符合这个时间区间的结果 "range":{ "date": { "gte": "begin time", "lte": "end time" } } } } } }
|
reference: