Elasticsearch(ES)的高級搜索(DSL搜索)(上篇)
- 2021 年 9 月 20 日
- 筆記
- elasticsearch, ES, 分佈式, 搜索引擎
1. 概述
之前聊了一下 Elasticsearch(ES)的基本使用,今天我們聊聊 Elasticsearch(ES)的高級搜索(DSL搜索),由於DSL搜索內容比較多,因此分為兩篇文章完成。
2. 場景說明
2.1 創建索引同時創建映射
PUT //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 //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":"//www.zhuifengren.cn/img/jsls.jpg" }
POST //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":"//www.zhuifengren.cn/img/xwe.jpg" }
POST //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":"//www.zhuifengren.cn/img/dsnzxr.jpg" }
……………………
3. 高級搜索(DSL搜索)(上篇)
3.1 在url中指定查詢條件(非DSL搜索)
GET //192.168.1.11:9200/index_user/_doc/_search?q=desc:一名&q=age:10
desc 是索引中的一個字段,一名 是需要檢索的關鍵字
age 是索引中的一個字段,10是要查的值
此方式用的比較少。
3.2 DSL基本查詢
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match":{ "desc":"一名" } } }
3.3 文檔中是否存在某字段
文檔中存在該字段,就會被查出來
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "exists":{ "field":"name" } } }
3.4 查詢所有
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match_all":{} } }
3.5 查詢部分字段
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match_all":{} }, "_source": [ "user_id", "name" ] }
3.6 分頁
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match_all":{} }, "from":0, // 從哪條文檔開始,文檔下標從 0 開始 "size":10 // 每頁多少條文檔 }
3.7 term查詢
term查詢,不會將關鍵字分詞,直接拿來查詢。
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "term":{ "desc":"一名" } } }
3.8 match查詢
match查詢,會將關鍵字先分詞,然後用每一個分詞去查詢,最後將結果取並集。
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match":{ "desc":"一名小學生" } } }
3.9 terms查詢
與term查詢類似,可以寫多個關鍵字,會用每個關鍵字去查詢,最後將結果取並集。
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "terms":{ "desc":[ "一名", "小學生" ] } } }
3.10 match_phrase查詢
與match類似,會先將關鍵字分詞,然後用每個分詞去查詢,但會對文檔中分詞間的間隔有一定限制,使用slop屬性去限制,默認是0,需要小於設置的間隔,才能匹配文檔。
例如:slop設置為0,則兩個分詞在文檔中的位置必須是緊挨着,否則無法命中。
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match_phrase":{ "desc":{ "query": "一名 學生", "slop":8 } } } }
3.11 match查詢擴展
1)match查詢後,結果取交集
POST //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "match":{ "desc": { "query": "一名小學生", "operator": "and" } } } }
2)指定匹配率
指定為整數,意思是文檔匹配分詞的最小個數,例如設置為3,意思是有關鍵字中3個分詞命中文檔就可以被查出來。
指定為百分比,意思是匹配關鍵字分詞的百分比,例如設置為60%,如果關鍵字分詞數量是4,則匹配的關鍵字分詞數除以總數大於60%就可以被查出來。
POST //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 //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 //192.168.1.11:9200/index_user/_doc/_search
參數:
{ "query":{ "multi_match":{ "query":"一名小學生 殭屍", "fields":[ "desc", "name" // "name^10" ] } } }
4. 綜述
今天簡單聊了一下 Elasticsearch(ES)的高級搜索(DSL搜索)的一部分內容,希望可以對大家的工作有所幫助。
歡迎大家幫忙點贊、評論、加關注 :)
關注追風人聊Java,每天更新Java乾貨。