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

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干貨。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容