> 技术文档 > ElasticSearch简称ES基础语法使用大全_es 语法

ElasticSearch简称ES基础语法使用大全_es 语法


一、查

1. 匹配查询

在Elasticsearch中,字符串搜索时,会对输入的查询字符串进行分析和分词,这可能导致意外匹配或未匹配的情况。使用以下语法进行匹配查询:

GET /your_index/_search{ \"query\": { \"match\": { \"your_field\": \"your_search_string\" } }}

2. 精确匹配字符串

term查询用于精确匹配,在对日期字符串进行term查询时,由于映射方式不同可能存在匹配不到的情况。语法如下:

GET /your_index/_search{ \"query\": { \"term\": { \"your_field.keyword\": \"your_exact_string\" } }}

3. 匹配某字段为空

查询某个字段为空的文档,可使用以下语法:

GET /your_index/_search{ \"query\": { \"bool\": { \"must_not\": { \"exists\": {  \"field\": \"your_field\" } } } }}

4. 多条件匹配

通过bool查询来组合多个查询条件,must表示所有条件都要满足,should表示至少满足一个条件,must_not表示不能满足该条件。示例如下:

GET /your_index/_search{ \"query\": { \"bool\": { \"must\": [ {  \"match\": { \"field1\": \"value1\"  } }, {  \"match\": { \"field2\": \"value2\"  } } ], \"should\": [ {  \"match\": { \"field3\": \"value3\"  } } ], \"must_not\": [ {  \"match\": { \"field4\": \"value4\"  } } ], \"filter\": [ {  \"range\": { \"age\": { \"gte\": 18, \"lte\": 30 }  } } ] } }}

5. 范围查询

查询某个字段在一定范围内的文档:

GET /your_index/_search{ \"query\": { \"range\": { \"age\": { \"gte\": 18, \"lt\": 30, \"boost\": 2.0 } } }}

6. 前缀查询

查询某个字段以指定前缀开头的文档:

GET /your_index/_search{ \"query\": { \"prefix\": { \"username\": { \"value\": \"john\", \"boost\": 1.0 } } }}

7. 通配符查询

使用通配符*(匹配任意字符序列)和?(匹配单个字符)进行查询:

GET /your_index/_search{ \"query\": { \"wildcard\": { \"email\": { \"value\": \"john*@example.com\", \"boost\": 1.0 } } }}

8. 正则表达式查询

使用正则表达式进行匹配查询:

GET /your_index/_search{ \"query\": { \"regexp\": { \"username\": { \"value\": \"joh?n(smith|doe)\", \"flags\": \"ALL\", \"max_determinized_states\": 10000, \"boost\": 1.0 } } }}

9. 模糊查询

查询与指定词相似的文档,允许一定的编辑距离(Levenshtein距离):

GET /your_index/_search{ \"query\": { \"fuzzy\": { \"username\": { \"value\": \"jon\", \"fuzziness\": \"AUTO\", \"prefix_length\": 0, \"max_expansions\": 50, \"transpositions\": true, \"boost\": 1.0 } } }}

10. ids查询

通过文档ID列表查询多个文档:

GET /your_index/_search{ \"query\": { \"ids\": { \"values\": [\"123\", \"456\", \"789\"] } }}

二、改

1. 通过es_id修改内容

根据文档的_id来修改文档内容,使用update接口。例如:

POST /your_index/_update/_id_123456{ \"doc\": { \"your_field\": \"new_value\" }}

2. 匹配修改内容

匹配满足特定条件的文档并进行修改,使用_update_by_query接口:

POST /your_index/_update_by_query{ \"query\": { \"match\": { \"your_field\": \"your_search_string\" } }, \"script\": { \"source\": \"ctx._source.your_field = \'new_value\'\" }}

3. 增加字段

为匹配的文档增加新字段:

POST /your_index/_update_by_query{ \"script\": { \"source\": \"ctx._source.new_field = \'new_value\'\" }, \"query\": { \"match_all\": {} }}

4. 删除字段

从匹配的文档中删除字段:

POST /your_index/_update_by_query{ \"script\": { \"source\": \"ctx._source.remove(\'field_to_delete\')\" }, \"query\": { \"match_all\": {} }}

5. 原子更新计数器

对数值字段进行原子递增或递减操作:

POST /your_index/_update/_id_123456{ \"script\": { \"source\": \"ctx._source.counter += params.count\", \"params\": { \"count\": 1 } }}

三、增

1. 添加单个文档

索引中添加单个文档,使用POST请求,并指定文档的_id(也可以由Elasticsearch自动生成)。示例:

POST /your_index/_doc/_id_123456{ \"field1\": \"value1\", \"field2\": \"value2\"}

2. 批量添加文档(Bulk API)

一次性添加多个文档,提高写入效率:

POST /your_index/_bulk{ \"index\" : { \"_id\" : \"1\" } }{ \"field1\" : \"value1\", \"field2\" : \"value2\" }{ \"index\" : { \"_id\" : \"2\" } }{ \"field1\" : \"value3\", \"field2\" : \"value4\" }

3. 自动生成ID添加文档

不指定_id,由Elasticsearch自动生成唯一ID:

POST /your_index/_doc{ \"field1\": \"value1\", \"field2\": \"value2\"}

4. 创建文档(存在则失败)

使用create操作,只有当文档ID不存在时才创建:

PUT /your_index/_create/_id_123456{ \"field1\": \"value1\", \"field2\": \"value2\"}

四、删

1. 通过_id删除

根据文档的_id删除文档,使用DELETE请求:

DELETE /your_index/_doc/_id_123456

2. 匹配删除

匹配满足特定条件的文档并删除,使用_delete_by_query接口:

POST /your_index/_delete_by_query{ \"query\": { \"match\": { \"your_field\": \"your_search_string\" } }}

3. 删除索引

删除整个索引及其所有文档:

DELETE /your_index

4. 按条件删除多个索引

删除名称匹配特定模式的多个索引:

DELETE /index1,index2DELETE /index*

五、聚合查询

1. 统计聚合

计算某个字段的平均值:

GET /your_index/_search{ \"size\": 0, \"aggs\": { \"avg_age\": { \"avg\": { \"field\": \"age\" } } }}

2. 分桶聚合

按某个字段的值进行分组统计:

GET /your_index/_search{ \"size\": 0, \"aggs\": { \"group_by_status\": { \"terms\": { \"field\": \"status.keyword\", \"size\": 10 } } }}

3. 嵌套聚合

在聚合结果中进行二次聚合:

GET /your_index/_search{ \"size\": 0, \"aggs\": { \"group_by_category\": { \"terms\": { \"field\": \"category.keyword\" }, \"aggs\": { \"avg_price\": {  \"avg\": { \"field\": \"price\"  } } } } }}

4. 范围聚合

按数值范围进行分组统计:

GET /your_index/_search{ \"size\": 0, \"aggs\": { \"price_ranges\": { \"range\": { \"field\": \"price\", \"ranges\": [  { \"to\": 100 },  { \"from\": 100, \"to\": 200 },  { \"from\": 200 } ] } } }}

5. 日期直方图聚合

按日期分组统计:

GET /your_index/_search{ \"size\": 0, \"aggs\": { \"sales_per_month\": { \"date_histogram\": { \"field\": \"date\", \"calendar_interval\": \"month\", \"format\": \"yyyy-MM\" } } }}

六、索引管理

1. 创建索引

创建一个新索引并指定映射:

PUT /new_index{ \"mappings\": { \"properties\": { \"title\": { \"type\": \"text\" }, \"content\": { \"type\": \"text\" }, \"timestamp\": { \"type\": \"date\" } } }}

2. 获取索引信息

获取索引的设置和映射信息:

GET /your_index

3. 更新索引设置

动态更新索引的设置:

PUT /your_index/_settings{ \"index\": { \"number_of_replicas\": 2 }}

4. 添加映射字段

向现有索引添加新字段:

PUT /your_index/_mapping{ \"properties\": { \"new_field\": { \"type\": \"keyword\" } }}

5. 关闭/打开索引

临时关闭索引以节省资源:

POST /your_index/_closePOST /your_index/_open

七、其他常用操作

1. 查看集群健康状态

检查集群的健康状态:

GET /_cluster/health

2. 查看节点信息

获取集群中所有节点的信息:

GET /_nodes

3. 刷新索引

使最近的更改可搜索:

POST /your_index/_refresh

4. 强制合并索引

减少索引段数量以提高性能:

POST /your_index/_forcemerge

5. 搜索模板

创建可重用的搜索模板:

PUT /_scripts/search_template{ \"script\": { \"lang\": \"mustache\", \"source\": { \"query\": { \"match\": {  \"{{field}}\": \"{{value}}\" } } } }}GET /your_index/_search/template{ \"id\": \"search_template\", \"params\": { \"field\": \"title\", \"value\": \"example\" }}

以上就是Elasticsearch的一些基础语法,涵盖了查询、修改、添加和删除等常见操作。在实际应用中,你可以根据具体需求灵活运用这些语法来操作Elasticsearch索引和文档。