本文繼續上文(Elasticsearch 入門實戰(3)--REST API 使用一(CAT,Index,Document,Ingest API))介紹 Elasticsearch REST API,相關的環境及軟體資訊如下:CentOS 7.6.1810、Elasticsearch 8.13.4。
1、Search APIs
1.1、Count API(查詢文件數量)
語法:
GET /<target>/_count
樣例:
curl -X GET 'http://10.49.196.33:9200/poet-index/_count' #查詢該索引的所有文件數量
curl -X GET 'http://10.49.196.33:9200/poet-index/_count?q=name:杜甫' #透過 Lucene 查詢語法指定條件
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.33:9200/poet-index/_count' -d ' #透過 "Query DSL" 指定條件
{
"query": {
"term": {
"name.keyword": {
"value": "杜甫"
}
}
}
}'
1.2、Search API(查詢文件)
語法:
GET /<target>/_search GET /_search POST /<target>/_search POST /_search
1.2.1、query
1.2.1.1、term/terms 查詢
term 查詢不會對輸入的內容進行分詞處理,而是作為一個整體來查詢。
A、查詢單個詞
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"term": {
"name": {
"value": "李白"
}
}
}
}'
B、查詢多個詞
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"terms": {
"name": ["李白", "杜甫"]
}
}
}'
1.2.1.2、range 查詢
按照範圍查詢。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"range": {
"age": {
"gte": 20,
"lte": 35
}
}
}
}'
1.2.1.3、exists 查詢
查詢對應欄位不為空的資料。
curl -X GET -H 'Content-Type:application/json' 'http://10.1.101.64:9200/poet-index/_search' -d '
{
"query": {
"exists": {
"field": "poems"
}
}
}'
1.2.1.4、match 相關查詢
A、match
對輸入的內容進行分詞處理,再根據分詞查詢。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match": {
"success": "理想主義"
}
},
"from": 0,
"size": 10,
"sort": [{
"name": {
"order": "asc"
}
}]
}'
B、multi_match
多欄位進行匹配。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"multi_match": {
"query": "太白",
"fields": ["about", "success"]
}
}
}'
C、match_phrase
類似 match,需要滿足以下條件:
1.文件的分詞列表要包含所有的搜尋分詞列表
2.搜尋分詞次序要和文件分詞次序一致
3.slop 引數控制著匹配到的文件分詞最大間距,預設為1(匹配到分詞要緊挨著)
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match_phrase": {
"success": "文學作家"
}
}
}'
D、match_all
查詢所有文件。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match_all": {
}
}
}'
不加請求體,也是一樣的效果,查詢所有文件。
curl -X GET 'http://10.49.196.11:9200/poet-index/_search'
E、match_none
與 match_all 相反,返回 0 個文件。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match_none": {
}
}
}'
1.2.1.5、query_string 查詢
query_string 可以同時實現前面幾種查詢方法。
A、類似 match
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"default_field": "success",
"query": "古典文學"
}
}
}'
B、類似 mulit_match
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"query": "古典文學",
"fields": ["about", "success"]
}
}
}'
C、類似 match_phrase
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"default_field": "success",
"query": "\"古典文學\""
}
}
}'
D、帶運算子查詢,運算子兩邊的詞不再分詞
1、查詢同時包含 ”文學“ 和 ”偉大“ 的文件
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"default_field": "success",
"query": "文學 AND 偉大"
}
}
}'
或
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"fields": ["success"],
"query": "文學 偉大",
"default_operator": "AND"
}
}
}'
2、查詢 name 或 success 欄位包含"文學"和"偉大"這兩個單詞,或者包含"李白"這個單詞的文件。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"query_string": {
"query": "(文學 AND 偉大) OR 李白",
"fields": ["name", "success"]
}
}
}'
1.2.1.6、simple_query_string 查詢
類似 query_string,主要區別如下:
1、不支援AND OR NOT ,會當做字元處理;使用 + 代替 AND,| 代替OR,- 代替 NOT
2、會忽略錯誤的語法
查詢同時包含 ”文學“ 和 ”偉大“ 的文件:
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"simple_query_string": {
"fields": ["success"],
"query": "文學 + 偉大"
}
}
}'
1.2.1.7、fuzzy 查詢
模糊查詢時使用的引數:
fuzziness |
允許的最大編輯距離,預設不開啟模糊查詢,相當於 fuzziness=0。支援的格式 1、可以是數字(0、1、2)代表固定的最大編輯距離 2、自動模式,AUTO:[low],[high] 查詢詞長度在 [0-low)範圍內編輯距離為 0(即強匹配) 查詢詞長度在 [low, high) 範圍內允許編輯 1 次 查詢詞長度 >high 允許編輯 2 次 |
prefix_length |
控制兩個字串匹配的最小相同的字首大小,也就是前 n 個字元不允許編輯,必須與查詢詞相同,預設是 0,大於 0 時可以顯著提升查詢效能 |
max_expansions |
產生的最大模糊選項 |
transpositions |
相鄰位置字元互換是否算作 1 次編輯距離,全文查詢不支援該引數 |
A、全文查詢時使用模糊引數
先分詞再計算模糊選項。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match": {
"success": {
"query": "古典文化",
"fuzziness": 1,
"prefix_length": 0,
"max_expansions": 5
}
}
}
}'
B、使用 fuzzy query
對輸入不分詞,直接計算模糊選項。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"fuzzy": {
"success": {
"value": "理想",
"fuzziness": 1,
"prefix_length": 0,
"transpositions": true
}
}
}
}'
1.2.1.8、wildcard 查詢
wildcard 查詢類似 SQL 語句中的 like;? 匹配一個字元,* 匹配多個字元。對於使用 wildcard 查詢的欄位建議欄位型別設為 wildcard 型別。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d ' { "query": { "wildcard": { "name": "李*" } } }'
1.2.1.9、bool 查詢
組合查詢使用 bool 來組合多個查詢條件。
條件 | 說明 |
must | 同時滿足 |
should | 滿足其中任意一個 |
must_not | 同時不滿足 |
filter | 過濾搜尋,不計算得分 |
A、查詢 success 包含 “思想” 且 age 在 [20-40] 之間的文件:
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"bool": {
"must": [{
"simple_query_string": {
"query": "思想",
"fields": ["success"]
}
}, {
"range": {
"age": {
"gte": 20,
"lte": 40
}
}
}]
}
}
}'
B、過濾出 success 包含 “思想” 且 age 在 [20-40] 之間的文件,不計算得分:
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"bool": {
"filter": [{
"simple_query_string": {
"query": "思想",
"fields": ["success"]
}
}, {
"range": {
"age": {
"gte": 20,
"lte": 40
}
}
}]
}
}
}'
1.2.2、aggs 查詢
聚合查詢類似 SQL 中的 group by 分組查詢。
A、求和,類似 select sum(age) from poet-index
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"aggs": {
"age_sum": {
"sum": {
"field": "age"
}
}
}
}'
B、類似 select count distinct(age) from poet-index
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/test-index/_search' -d '
{
"aggs": {
"age_count": {
"cardinality": {
"field": "age"
}
}
}
}'
C、數量、最大、最小、平均、求和
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"aggs": {
"age_stats": {
"stats": {
"field": "age"
}
}
},
"size": 0
}'
D、類似 select name,count(*) from poet-index group by name
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"aggs": {
"name_terms": {
"terms": {
"field": "name"
}
}
},
"size": 0
}'
E、類似 select name,age, count(*) from poet-index group by name,age
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"aggs": {
"name_terms": {
"terms": {
"field": "name"
},
"aggs": {
"age_terms": {
"terms": {
"field": "age"
}
}
}
}
},
"size": 0
}'
F、類似 select avg(age) from poet-indexwhere name='李白'
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"bool": {
"filter": {
"term": {
"name": "李白"
}
}
}
},
"aggs": {
"age_avg": {
"avg": {
"field": "age"
}
}
},
"size": 0
}'
1.2.3、suggest 查詢
如果希望 Elasticsearch 能夠根據我們的搜尋內容給一些推薦的搜尋選項,可以使用推薦搜尋。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"suggest": {
"success_suggest": {
"text": "思考",
"term": {
"field": "success",
"analyzer": "ik_max_word",
"suggest_mode": "always",
"min_word_length":2
}
}
}
}'
推薦模式 suggest_mode:
推薦模式 | 說明 |
popular | 推薦詞頻更高的一些搜尋 |
missing | 當沒有要搜尋的結果的時候才推薦 |
always | 無論什麼情況下都進行推薦 |
1.2.4、highlight
對搜尋結果中的關鍵字高亮顯示。
curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
"query": {
"match": {
"success": "思想"
}
},
"highlight": {
"pre_tags": "<span color='red'>",
"post_tags": "</span>",
"fields": {
"success": {}
}
}
}'
詳細的 Elasticsearch REST API 使用說明,請參考官網文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html。