ElasticSearch的基本操作与命令

独自空忆成欢 提交于 2020-08-15 04:46:51

注:例子中的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"}}

需要注意的地方:由于批量操作是加载到内存中的,如果值多,会比较慢;所有操作在一起只需符合语法规则,内容可以多样

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!