Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)

追風人聊Java 發表於 2021-09-20
ElasticSearch

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