美文网首页
Elasticsearch(ES)的高级搜索(DSL搜索)(上篇

Elasticsearch(ES)的高级搜索(DSL搜索)(上篇

作者: 追风人聊Java | 来源:发表于2021-12-19 08:09 被阅读0次

    1. 概述

    之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成。

    2. 场景说明

    2.1 创建索引同时创建映射

    PUT http://192.168.1.11:9200/index_user

    参数:

    {
        "settings":{
            "index":{
                "number_of_shards":5,
                "number_of_replicas":0
            }
        },
        "mappings" : {
            "properties":{
                "user_id":{
                    "type":"long"
                },
                "name":{
                    "type":"text",
                    "analyzer":"ik_max_word"
                },
                "login_name":{
                    "type":"keyword"
                },
                "age":{
                    "type":"integer"
                },
                "birthday":{
                    "type":"date"
                },
                "desc":{
                    "type":"text",
                    "analyzer":"ik_max_word"
                },
                "head_url":{
                    "type":"text",
                    "index":false
                }
            }
        }
    }
    

    2.2 创建文档

    此处只举几个例子

    POST http://192.168.1.11:9200/index_user/_doc/1

    参数:

    {
        "user_id":"1",
        "name":"僵尸猎手",
        "login_name":"jsls",
        "age":25,
        "birthday":"1990-03-01",
        "desc":"我是一名房产经纪人,现在转行了,目前是一名运输工人",
        "head_url":"https://www.zhuifengren.cn/img/jsls.jpg"
    }
    

    POST http://192.168.1.11:9200/index_user/_doc/2

    参数:

    {
        "user_id":"2",
        "name":"夏维尔",
        "login_name":"xwe",
        "age":28,
        "birthday":"1992-06-06",
        "desc":"我是一名高级开发经理,每天坐地铁上班,在北京住,从不堵车",
        "head_url":"https://www.zhuifengren.cn/img/xwe.jpg"
    }
    

    POST http://192.168.1.11:9200/index_user/_doc/3

    参数:

    {
        "user_id":"3",
        "name":"迪士尼在逃仙柔",
        "login_name":"dsnzxr",
        "age":10,
        "birthday":"2011-06-22",
        "desc":"我是一名五年级的小学生,每天专车接专车送,中午在学校入伙,食堂菜可好了,上学期期末考试我拿了三好学生奖",
        "head_url":"https://www.zhuifengren.cn/img/dsnzxr.jpg"
    }
    

    ……………………

    3. 高级搜索(DSL搜索)(上篇)

    3.1 在url中指定查询条件(非DSL搜索)

    GET http://192.168.1.11:9200/index_user/_doc/_search?q=desc:一名&q=age:10

    desc 是索引中的一个字段,一名 是需要检索的关键字

    age 是索引中的一个字段,10是要查的值

    此方式用的比较少。

    3.2 DSL基本查询

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match":{
                "desc":"一名"
            }
        }
    }
    

    3.3 文档中是否存在某字段

    文档中存在该字段,就会被查出来

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "exists":{
                "field":"name"
            }
        }
    }
    

    3.4 查询所有

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match_all":{}
        }
    }
    

    3.5 查询部分字段

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match_all":{}
        },
        "_source": [
            "user_id",
            "name"
        ]
    }
    

    3.6 分页

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match_all":{}
        },
        "from":0,   // 从哪条文档开始,文档下标从 0 开始
        "size":10   // 每页多少条文档
    }
    

    3.7 term查询

    term查询,不会将关键字分词,直接拿来查询。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "term":{
                "desc":"一名"
            }
        }
    }
    

    3.8 match查询

    match查询,会将关键字先分词,然后用每一个分词去查询,最后将结果取并集。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match":{
                "desc":"一名小学生"
            }
        }
    }
    

    3.9 terms查询

    与term查询类似,可以写多个关键字,会用每个关键字去查询,最后将结果取并集。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "terms":{
                "desc":[
                    "一名",
                    "小学生"
                ]
            }
        }
    }
    

    3.10 match_phrase查询

    与match类似,会先将关键字分词,然后用每个分词去查询,但会对文档中分词间的间隔有一定限制,使用slop属性去限制,默认是0,需要小于设置的间隔,才能匹配文档。

    例如:slop设置为0,则两个分词在文档中的位置必须是紧挨着,否则无法命中。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match_phrase":{
                "desc":{
                    "query": "一名 学生",
                    "slop":8
                }
            }
        }
    }
    

    3.11 match查询扩展

    1)match查询后,结果取交集

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match":{
                "desc": {
                    "query": "一名小学生",
                    "operator": "and"
                }
            }
        }
    }
    

    2)指定匹配率

    指定为整数,意思是文档匹配分词的最小个数,例如设置为3,意思是有关键字中3个分词命中文档就可以被查出来。

    指定为百分比,意思是匹配关键字分词的百分比,例如设置为60%,如果关键字分词数量是4,则匹配的关键字分词数除以总数大于60%就可以被查出来。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "match":{
                "desc": {
                    "query": "一名小学生",
                    "minimum_should_match":"3"  // 或 "minimum_should_match":"60%"
                }
            }
        }
    }
    

    3.12 使用id集合查询

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query": {
            "ids":{
                "type":"_doc",
                "values":["1","3"]
            }
        }
    }
    

    3.13 match的多字段查询

    当字段名称写为 "name^10"时,意思是将 name 字段的权重提升10倍,则命中name的文档分数会高,排序会靠前。

    POST http://192.168.1.11:9200/index_user/_doc/_search

    参数:

    {
        "query":{
            "multi_match":{
                "query":"一名小学生 僵尸",
                "fields":[
                        "desc",
                        "name"   // "name^10"
                    ]
            }
        }
    }
    

    4. 综述

    今天简单聊了一下 Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,希望可以对大家的工作有所帮助。

    欢迎大家帮忙点赞、评论、加关注 :)

    关注追风人聊Java,每天更新Java干货。

    相关文章

      网友评论

          本文标题:Elasticsearch(ES)的高级搜索(DSL搜索)(上篇

          本文链接:https://www.haomeiwen.com/subject/shwnfrtx.html