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