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

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

作者: 追风人聊Java | 来源:发表于2021-12-20 10:42 被阅读0次

    1. 概述

    之前聊了Elasticsearch(ES)的高级搜索(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 布尔查询

    参数中可以包含多种条件的组合。

    其中 must 块下的条件,文档必须都符合才会被查出来。

    must_not 块下的条件,文档必须都不符合才会被查出来。

    should 块下的条件,文档只要符合一个就能被查出来。

    最终结果集是 must、must_not、should 块查询结果的交集。

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

    参数:

    {
        "query": {
            "bool": {
                "must": [
                    {
                        "match": {
                            "desc": "一名"
                        }
                    },
                    {
                        "match": {
                            "desc": "小学生"
                        }
                    }
                ],
                "must_not": [],
                "should": [
                    {
                        "match": {
                            "desc": "一名"
                        }
                    },
                    {
                        "match": {
                            "desc": "小学生"
                        }
                    }
                    
                ]
            }
        }
    }
    

    3.2 布尔查询,为某个查询加权

    命中加权查询项的文档,分数会提高

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

    参数:

    {
        "query": {
            "bool": {
                "should": [
                    {
                        "match": {
                            "desc": {
                                "query": "一名",
                                "boost":10
                            }
                            
                        }
                    },
                    {
                        "match": {
                            "desc": "小学生"
                        }
                    }
                    
                ]
            }
        }
    }
    

    3.3 结果集过滤

    从ES查询后,再将结果集过滤一次。

    支持范围查询:

    gte:大于等于

    lte:小于等于

    gt:大于

    lt:小于

    也支持 term、match 操作。

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

    参数:

    {
        "query":{
            "match":{
                "desc":"一名"
            }
        },
        "post_filter": {
            "range" : {
                "age": {
                    "gt":10,
                    "lt":26
                }
            }
        }
    }
    

    3.4 自定义排序

    文本类型的字段,只能对keyword类型的文本字段排序,text类型的不能用于排序。

    文本类型字段定义时,可以既是text类型,又是keyword类型,排序时使用 字段.keyword 进行排序。

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

    参数:

    {
        "query":{
            "match":{
                "desc":"一名"
            }
        },
        "sort":[
            {
                "age":"desc"
            },
            {
                "user_id":"asc"
            },
            {
                "login_name":"asc"
            }
        ]
    }
    

    3.5 高亮

    高亮效果就是在匹配的关键字上增加标签,便于前端去高亮显示。

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

    参数:

    {
        "query":{
            "match":{
                "desc":"一名小学生"
            }
        },
        "highlight":{
            "pre_tags":"<span>",
            "post_tags":"</span>",
            "fields":{
                "desc":{}
            }
        }
    }
    

    4. 综述

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

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

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

    相关文章

      网友评论

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

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