注:例子中的json有的是截取的部分数据,不可完全照搬,需灵活使用。
- 获取集群健康值: GET /_cluster/health
- 创建索引:PUT /index_test
{
"settings": {
"index": {
"number_of_shards": "3",
"number_of_replicas": "0"
}
}
} - 删除索引: DELETE /index_test
- 查询索引的相关信息:GET /_cat/indices?v
- mappings自定义创建:PUT /index_test 在创建索引时加入:
"mappings": {
"properties": {
"username": {
"type": "text",
"index": true
},
"password": {
"type": "keyword",
"index": false
}
}
}
- analyze分词器的使用 : GET /index_test2/_analyze
{
"field": "text",
"text": "icoding is very well!"
}
- 如果在创建完索引后没有创建mapping,可以后续添加:POST /index_test/_mapping
{
"properties": {
"username": {
"type": "text",
"index": true
},
"password": {
"type": "keyword",
"index": false
}
}
}
- document文档查询:GET /index_test/_doc/1
- document文档更新:POST /index_test/_doc/1/_update
{
"doc": {
"age": 30
}
}
- document文档删除:GET /index_test/_doc/1/_update
- QueryString的查询方式,查询简单:GET /index_customer/_search?q=username:张三&q=age:24
DSL查询语法:如果需要复杂的查询条件,就需要DSL来进行查询,内容是基于json,查询灵活方便,有利于复杂查询
POST /index_customer/_doc/_search
{
"query": {
"match": {
"username": "张三"
}
}
}
- 查询所有数据并进行filter过滤并且分页
{
"query": {
"match_all":{}
},
"_source": ["id","username","age"],
"from": 0,
"size": 5
}
- 通过DSL一次查询出多个ID
{
"query":{
"ids": {
"type": "_doc",
"values": ["1001","1010","1012"]
}
},
"_source": ["id","username","age","sex"]
}
- term查询,将条件里的词不进行分词来查询,但可以设置多个;match查询,将条件里的词使用这个field的分词器进行分词后和field里的分词逐一匹配。例子参考上面的DLSL查询语法
- math_phrase短语匹配:query里的词必须都匹配,而且还要相邻;slop: 允许词语间跳过的数量,默认可以不写,不写是挨着的没有跳数
- math的operator:or:搜索的分词内容,只要有一个词语匹配就展示;and:搜索的分词内容必须全部匹配
- math的minimum_should_match:最低匹配精度,配置有两种,一种是占比:70%,另一种是绝对值:可以直接写数字:3,至少要3个词都匹配
- multi_math:多列查询
{
"query": {
"multi_match": {
"query": "我在学习ElasticSearch",
"fields": [
"desc",
"username"
]
}
}
}
- DSL布尔查询,就是多条件组合查询,可以在不同列上进行:must、should、must_not虽然语法可以并列,must和should同时写,只有must生效,must和must_not同时写,会在must符合后进行must_not条件剔除。
"bool": {
"must": [
{
"match": {
"desc": "学习"
}
}
],
"should": [
{
"match": {
"username": "张三"
}
},
{
"term": {
"username": "李四"
}
}
]
}
上面例子的条件是desc中带有“学习”字样,并且username里有“张三”或者“李四”。此查询还可以通过组合的形式,拓展出其他2中解决方案。
- DSL搜索过滤器:跟query并列的位置使用post_filter用于查询后,对结果数据进行筛选
"post_filter": {
"range": {
"age": {
"gt": 20,
"lt": 40
}
}
}
- DSL搜索排序:sort "sort": [
{
"consume": "desc"
},
{
"age": "asc"
}
] - prefix : 根据前缀去查询
- fuzzy : 搜索引擎自动纠错的功能 oschinna -> oschina
- wildcard : 占位符查询
ElasticSearch的批量文档操作
- 上面提到过通过DSL可以进行批量查询,也可以使用_mget来进行查询 POST /index_customer/_doc/_mget
{
"ids": ["1001","1009","1010"]
} - create/index操作,create:文档不存在则创建,存在则报错,但发生异常不会影响其他行的数据导入。不用加索引名,直接在路径里写_bulk POST /_bulk
POST /_bulk
{"create":{"_index":"index_customer","_type":"_doc","_id":"1013"}}
{"id":1013,"age":30,"username":"张三","consume":8848.66,"sex":1,......} //回车
index:文档不存在则创建,存在则覆盖。POST /index_customer/_doc/_bulk
{"index":{"_id":"1013"}}
{"id":1013,"age":30,"username":"张三","consume":8848.66,"sex":1,......} //回车
- 批量更新 POST /index_customer/_doc/_bulk
{"update":{"_id":"1013"}}
{"doc":{"username":"李四"}}
- 批量删除
POST /index_customer/_doc/_bulk
{"delete":{"_id":"1011"}}
{"delete":{"_id":"1012"}}
需要注意的地方:由于批量操作是加载到内存中的,如果值多,会比较慢;所有操作在一起只需符合语法规则,内容可以多样
来源:oschina
链接:https://my.oschina.net/u/4080405/blog/4289072