目錄
ES高級查詢Query DSL
match_all
返回源數(shù)據(jù)_source
返回指定條數(shù)size
分頁查詢from&size
指定字段排序sort
術(shù)語級別查詢
Term query術(shù)語查詢
Terms Query多術(shù)語查詢
exists query
ids query
range query范圍查詢
prefix query前綴查詢
wildcard query通配符查詢
fuzzy query模糊查詢
ES高級查詢Query DSL
? ? ? ?ES中提供了一種強大的檢索數(shù)據(jù)方式,這種檢索方式稱之為Query DSL(Domain Specified Language 領(lǐng)域?qū)S谜Z言),Query DSL是利用Rest API傳遞JSON格式的請求體(RequestBody)數(shù)據(jù)與ES進行交互,這種方式的豐富查詢語法讓ES檢索變得更強大更簡潔。
語法:
GET /es_db/_doc/_search {json請求體數(shù)據(jù)}
可以簡化為下面寫法
GET /es_db/_search {json請求體數(shù)據(jù)}
示例
#無條件查詢,默認返回10條數(shù)據(jù)
GET /user/_search
{
"query":{
"match_all":{}
}
}
took:花費的時間
total.value:符合條件的總文檔
hits:結(jié)果集,默認前10個文檔
_index:索引名
_id:文檔的id
_score:相關(guān)度評分
source:文檔原生信息
示例數(shù)據(jù)
#指定ik分詞器
PUT /user
{
"settings" : {
"index" : {
"analysis.analyzer.default.type": "ik_max_word"
}
}
}
# 創(chuàng)建文檔,指定id
PUT /user/_doc/1
{
"name": "張三",
"sex": 1,
"age": 25,
"address": "北京",
"remark": "java"
}
PUT /user/_doc/2
{
"name": "李四",
"sex": 1,
"age": 28,
"address": "南京",
"remark": "java"
}
PUT /user/_doc/3
{
"name": "王五",
"sex": 0,
"age": 26,
"address": "廣州白云山",
"remark": "php"
}
PUT /user/_doc/4
{
"name": "趙六",
"sex": 0,
"age": 22,
"address": "長沙",
"remark": "python"
}
PUT /user/_doc/5
{
"name": "張龍",
"sex": 0,
"age": 19,
"address": "天津",
"remark": "java"
}
PUT /user/_doc/6
{
"name": "趙虎",
"sex": 1,
"age": 32,
"address": "長沙",
"remark": "java"
}
PUT /user/_doc/7
{
"name": "李虎",
"sex": 1,
"age": 32,
"address": "廣州",
"remark": "java"
}
PUT /user/_doc/8
{
"name": "張星",
"sex": 1,
"age": 32,
"address": "武漢",
"remark": "golang"
}
match_all
使用match_all,匹配所有文檔,默認只會返回10條數(shù)據(jù)。
原因:_search查詢默認采用的是分頁查詢,每頁記錄數(shù)size的默認值為10。如果想顯示更多數(shù)據(jù),指定size。
GET /user/_search
等同于
GET /user/_search
{
"query":{
"match_all":{}
}
}
返回源數(shù)據(jù)_source
# 返回指定字段
GET /user/_search
{
"query": {
"match_all": {}
},
"_source": ["name","address"]
}
#在查詢中過濾
#不查看源數(shù)據(jù),僅查看元字段
{
"_source": false,
"query": {
...
}
}
#只看以obj.開頭的字段
{
"_source": "obj.*",
"query": {
...
}
}
返回指定條數(shù)size
size 關(guān)鍵字:指定查詢結(jié)果中返回指定條數(shù)。默認返回值10條。
GET /user/_search
{
"query": {
"match_all": {}
},
"size": 100
}
分頁查詢from&size
size:顯示應(yīng)該返回的結(jié)果數(shù)量,默認是?10
from:顯示應(yīng)該跳過的初始結(jié)果數(shù)量,默認是?0
from 關(guān)鍵字用來指定起始返回位置,和size關(guān)鍵字連用可實現(xiàn)分頁效果
GET /user/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 5
}
指定字段排序sort
注意:會讓得分失效
GET /user/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": "desc"
}
]
}
#排序,分頁
GET /user/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"age": "desc"
}
],
"from": 10,
"size": 5
}
術(shù)語級別查詢
? ? ? ?術(shù)語級別查詢(Term-Level Queries)指的是搜索內(nèi)容不經(jīng)過文本分析直接用于文本匹配,這個過程類似于數(shù)據(jù)庫的SQL查詢,搜索的對象大多是索引的非text類型字段。Elasticsearch 中的一些術(shù)語級別查詢示例包括 term、terms 和 range 查詢。
Term query術(shù)語查詢
? ? ? ?術(shù)語查詢直接返回包含搜索內(nèi)容的文檔,常用來查詢索引中某個類型為keyword的文本字段,類似于SQL的“=”查詢,使用十分普遍。
? ? ? ?注意:最好不要在term查詢的字段中使用text字段,因為text字段會被分詞,這樣做既沒有意義,還很有可能什么也查不到。
# 對bool,日期,數(shù)字,結(jié)構(gòu)化的文本可以利用term做精確匹配
# term 精確匹配
GET /user/_search
{
"query": {
"term": {
"age": {
"value": 28
}
}
}
}
# 采用term精確查詢, 查詢字段映射類型為keyword
GET /user/_search
{
"query":{
"term": {
"address.keyword": {
"value": "廣州"
}
}
}
}
在ES中,Term查詢,對輸入不做分詞。會將輸入作為一個整體,在倒排索引中查找準確的詞項,并且使用相關(guān)度算分公式為每個包含該詞項的文檔進行相關(guān)度算分。
可以通過 Constant Score 將查詢轉(zhuǎn)換成一個 Filtering,避免算分,并利用緩存,提高性能。
將Query 轉(zhuǎn)成 Filter,忽略TF-IDF計算,避免相關(guān)性算分的開銷,F(xiàn)ilter可以有效利用緩存。
GET /user/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"address.keyword": "廣州"
}
}
}
}
}
term處理多值字段時,term查詢是包含,不是等于。
POST /employee/_bulk
{"index":{"_id":1}}
{"name":"小明","interest":["跑步","籃球"]}
{"index":{"_id":2}}
{"name":"小紅","interest":["跳舞","畫畫"]}
{"index":{"_id":3}}
{"name":"小麗","interest":["跳舞","唱歌","跑步"]}
POST /employee/_search
{
"query": {
"term": {
"interest.keyword": {
"value": "跑步"
}
}
}
}
Terms Query多術(shù)語查詢
? ? ? ?Terms query用于在指定字段上匹配多個詞項(terms)。它會精確匹配指定字段中包含的任何一個詞項。
POST /user/_search
{
"query": {
"terms": {
"remark.keyword": ["java", "php"]
}
}
}
exists query
在Elasticsearch中可以使用exists進行查詢,以判斷文檔中是否存在對應(yīng)的字段。
#查詢索引庫中存在remarks字段的文檔數(shù)據(jù)
GET /user/_search
{
"query": {
"exists":
{
"field": "remark"
}
}
}
ids query
ids 關(guān)鍵字?: 值為數(shù)組類型,用來根據(jù)一組id獲取多個對應(yīng)的文檔。
GET /user/_search
{
"query": {
"ids": {
"values": [1,2]
}
}
}
range query范圍查詢
- range:范圍關(guān)鍵字
- gte 大于等于
- lte ?小于等于
- gt 大于
- lt 小于
- now 當前時
POST /user/_search
{
"query": {
"range": {
"age": {
"gte": 25,
"lte": 28
}
}
}
}
#日期范圍比較
DELETE /product
POST /product/_bulk
{"index":{"_id":1}}
{"price":100,"date":"2021-01-01","productId":"XHDK-1293"}
{"index":{"_id":2}}
{"price":200,"date":"2022-01-01","productId":"KDKE-5421"}
GET /product/_mapping
GET /product/_search
{
"query": {
"range": {
"date": {
"gte": "now-2y"
}
}
}
}
prefix query前綴查詢
它會對分詞后的term進行前綴搜索。
prefix的原理:需要遍歷所有倒排索引,并比較每個term是否以所指定的前綴開頭。
GET /user/_search
{
"query": {
"prefix": {
"address": {
"value": "廣州"
}
}
}
}
wildcard query通配符查詢
通配符查詢:工作原理和prefix相同,只不過它不是只比較開頭,它能支持更為復(fù)雜的匹配模式。
GET /user/_search
{
"query": {
"wildcard": {
"address": {
"value": "*京*"
}
}
}
}
fuzzy query模糊查詢
在實際的搜索中,我們有時候會打錯字,從而導(dǎo)致搜索不到。在Elasticsearch中,我們可以使用fuzziness屬性來進行模糊查詢,從而達到搜索有錯別字的情形。
fuzzy 查詢會用到兩個很重要的參數(shù),fuzziness,prefix_length
1. fuzziness(模糊度):fuzziness
參數(shù)指定了允許的編輯距離(Levenshtein距離)。編輯距離是指在兩個字符串之間,從一個字符串轉(zhuǎn)換到另一個字符串所需的最小編輯操作數(shù)(插入、刪除、替換)。在Fuzzy查詢中,編輯距離表示允許的最大差異數(shù)。較大的編輯距離意味著更寬松的匹配條件,允許更多的不匹配。常見的編輯距離值包括0、1、2,其中0表示精確匹配,1表示允許一個字符的差異,2表示允許兩個字符的差異,以此類推。文章來源:http://www.zghlxwxcb.cn/news/detail-830508.html
2. prefix_length(前綴長度):prefix_length
參數(shù)用于控制在執(zhí)行Fuzzy查詢時要忽略的術(shù)語的前綴長度。在實際文本中,可能存在大量共享前綴的術(shù)語,而這些前綴不應(yīng)該影響Fuzzy匹配。通過設(shè)置prefix_length
參數(shù),你可以指定要忽略的前綴長度,以便更精確地匹配剩余的部分。較大的前綴長度可以提高查詢性能,因為它減少了需要比較的字符數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-830508.html
GET /user/_search
{
"query": {
"fuzzy": {
"address": {
"value": "唄京",
"fuzziness": 1
}
}
}
}
到了這里,關(guān)于ElasticSearch級查詢Query DSL上的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!