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