- 查詢(xún)所有 match_all
- 分頁(yè)查詢(xún) from?+?size
- 深分頁(yè)查詢(xún) Scroll
- 指定字段排序 sort
- 返回指定字段
_source
- match
- 短語(yǔ)查詢(xún) match_phrase
- 多字段查詢(xún) multi_match
- query_string
- 關(guān)鍵詞查詢(xún) Term
- 前綴查詢(xún) prefix
- 通配符查詢(xún) wildcard
- 范圍查詢(xún) range
- 多 id 查詢(xún) ids
- 模糊查詢(xún) fuzzy
- 高亮 highlight
- Query?DSL(Domain?Specified?Language)是利用Rest?API傳遞JSON格式的請(qǐng)求體(RequestBody)與ES進(jìn)行交互
查詢(xún)所有 match_all
- 使用match_all,默認(rèn)只會(huì)返回10條數(shù)據(jù)
_search
查詢(xún)默認(rèn)采用的是分頁(yè)查詢(xún),每頁(yè)記錄數(shù)size的默認(rèn)值為10- 如果想顯示更多數(shù)據(jù),指定size
GET?/es_db/_search
# 等同于
GET?/es_db/_search
{"query":{"match_all":{}}}
分頁(yè)查詢(xún) from?+?size
- 返回指定條數(shù)size
- size?關(guān)鍵字:?指定查詢(xún)結(jié)果中返回指定條數(shù)。?默認(rèn)返回值10條
- from?+?size的結(jié)果必須小于或等于10000
- 可以采用scroll?api更高效的請(qǐng)求大量數(shù)據(jù)集
GET?/es_db/_search
{"query":{"match_all":{}},"size":?100}
- 查詢(xún)結(jié)果的窗口的限制可以通過(guò)參數(shù)index.max_result_window進(jìn)行設(shè)置
- index.max_result_window主要用來(lái)限制單次查詢(xún)滿(mǎn)足查詢(xún)條件的結(jié)果窗口的
- 不能簡(jiǎn)單理解成查詢(xún)返回給調(diào)用方的數(shù)據(jù)量
- 窗口大小由from?+?size共同決定
- 主要是為了限制內(nèi)存的消耗
- 盡管最后我們只取了10條數(shù)據(jù)返回給客戶(hù)端,但ES進(jìn)程執(zhí)行查詢(xún)操作的過(guò)程中確需要將(1000000?+?10)的記錄都加載到內(nèi)存中
- 這也是ES中不推薦采用(from?+?size)方式進(jìn)行深度分頁(yè)的原因
PUT?/es_db/_settings
{"index.max_result_window":"20000"}
# 修改所有的索引
PUT?/_all/_settings
{"index.max_result_window":"20000"}
- 分頁(yè)查詢(xún) form
- from?關(guān)鍵字:?用來(lái)指定起始返回位置,和size關(guān)鍵字連用可實(shí)現(xiàn)分頁(yè)效果
GET?/es_db/_search
{"query":{"match_all":{}},"size":5,"from":0}
深分頁(yè)查詢(xún) Scroll
- 查詢(xún)命令中新增 scroll=1m,說(shuō)明采用游標(biāo)查詢(xún),保持游標(biāo)查詢(xún)窗口一分鐘
GET?/es_db/_search?scroll=1m
{"query":{"match_all":{}},"size":2}
- 采用游標(biāo)id查詢(xún)
- 多次根據(jù)scroll_id游標(biāo)查詢(xún),直到?jīng)]有數(shù)據(jù)返回則結(jié)束查詢(xún)
- 采用游標(biāo)查詢(xún)索引全量數(shù)據(jù),更安全高效,限制了單次對(duì)內(nèi)存的消耗
GET?/_search/scroll
{"scroll":"1m","scroll_id":"FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFmNwcVdjblRxUzVhZXlicG9HeU02bWcAAAAAAABmzRY2YlV3Z0o5VVNTdWJobkE5Z3MtXzJB"}
指定字段排序 sort
GET?/es_db/_search
{"query":{"match_all":{}},"sort":[{"age":"desc"}]}
返回指定字段_source
_source
?關(guān)鍵字:?是一個(gè)數(shù)組,在數(shù)組中用來(lái)指定展示那些字段
GET?/es_db/_search
{"query":{"match_all":{}},"_source":["name","address"]}
match
- match在匹配時(shí)會(huì)對(duì)所查找的關(guān)鍵詞進(jìn)行分詞,然后按分詞匹配查找
- query?:?指定匹配的值
- operator?:?匹配條件類(lèi)型
- and?:?條件分詞后都要匹配
- or?:?條件分詞后有一個(gè)匹配即可 (默認(rèn))
- minmum_should_match?:?最低匹配度,即條件在倒排索引中最低的匹配度
# 模糊匹配?match?分詞后 or 的效果
GET?/es_db/_search
{"query":{"match":{"address":"廣州白云山公園"}}}
#?分詞后?and 的效果
GET?/es_db/_search
{"query":{"match":{"address":{"query":"廣州白云山公園","operator":"AND"}}}}
- 當(dāng)operator參數(shù)設(shè)置為or時(shí),minnum_should_match參數(shù)用來(lái)控制匹配的分詞的最少數(shù)量
# 最少匹配 廣州,公園 兩個(gè)詞
GET?/es_db/_search
{"query":{"match":{"address":{"query":"廣州公園","minimum_should_match":2}}}}
短語(yǔ)查詢(xún) match_phrase
- match_phrase 查詢(xún)分析文本并根據(jù)分析的文本創(chuàng)建一個(gè)短語(yǔ)查詢(xún)
- match_phrase?會(huì)將檢索關(guān)鍵詞分詞
- match_phrase 的分詞結(jié)果必須在被檢索字段的分詞中都包含,而且順序必須相同,而且默認(rèn)必須都是連續(xù)的
GET?/es_db/_search
{"query":{"match_phrase":{"address":"廣州白云山"}}}
- address 改成”廣州白云“可能查不出數(shù)據(jù)
- 廣州和白云不是相鄰的詞條,中間會(huì)隔一個(gè)白云山
- 而match_phrase匹配的是相鄰的詞條
- 可以借助slop參數(shù)解決詞條間隔的問(wèn)題
- slop參數(shù)告訴match_phrase查詢(xún)?cè)~條能夠相隔多遠(yuǎn)時(shí)仍然將文檔視為匹配
# 廣州云山分詞后相隔為 2,可以匹配到結(jié)果
GET?/es_db/_search
{"query":{"match_phrase":{"address":{"query":"廣州云山","slop":2}}}}
多字段查詢(xún) multi_match
- 可以根據(jù)字段類(lèi)型,決定是否使用分詞查詢(xún),得分最高的在前面
- 字段類(lèi)型分詞,將查詢(xún)條件分詞之后進(jìn)行查詢(xún),如果該字段不分詞就會(huì)將查詢(xún)條件作為整體進(jìn)行查詢(xún)
GET?/es_db/_search
{"query":{"multi_match":{"query":"長(zhǎng)沙張龍","fields":["address","name"]}}}
query_string
- 允許我們?cè)趩蝹€(gè)查詢(xún)字符串中指定 AND?|?OR?|?NOT 條件,同時(shí)也支持多字段搜索
- 在所有字段中搜索
- 查詢(xún)字段分詞就將查詢(xún)條件分詞查詢(xún),查詢(xún)字段不分詞將查詢(xún)條件不分詞查詢(xún)
- 未指定字段查詢(xún)
GET?/es_db/_search
{"query":{"query_string":{"query":"張三?OR?橘子洲"}}}
GET?/es_db/_search
{"query":{"query_string":{"default_field":"address","query":"白云山?OR?橘子洲"}}}
GET?/es_db/_search
{"query":{"query_string":{"fields":["name","address"],"query":"張三?OR?(廣州?AND?王五)"}}}
simple_query_string
- 類(lèi)似 Query?String,但是會(huì)忽略錯(cuò)誤的語(yǔ)法
- 同時(shí)只支持部分查詢(xún)語(yǔ)法,不支持 AND?OR?NOT,會(huì)當(dāng)作字符串處理
- 支持部分邏輯
- 默認(rèn)的 operator 是 OR
GET?/es_db/_search
{"query":{"simple_query_string":{"fields":["name","address"],"query":"廣州公園","default_operator":"AND"}}}
關(guān)鍵詞查詢(xún) Term
- Term 用來(lái)使用關(guān)鍵詞查詢(xún) (精確匹配),還可以用來(lái)查詢(xún)沒(méi)有被進(jìn)行分詞的數(shù)據(jù)類(lèi)型
- Term 是表達(dá)語(yǔ)意的最小單位
- match 在匹配時(shí)會(huì)對(duì)所查找的關(guān)鍵詞進(jìn)行分詞,然后按分詞匹配查找
- 而 term 會(huì)直接對(duì)關(guān)鍵詞進(jìn)行查找
- 一般模糊查找的時(shí)候,多用 match,而精確查找時(shí)可以使用 term
- 只有 text 類(lèi)型分詞
- Term 查詢(xún),對(duì)輸入不做分詞
- 會(huì)將輸入作為一個(gè)整體,在倒排索引中查找準(zhǔn)確的詞項(xiàng)
- 并且使用相關(guān)度算分公式為每個(gè)包含該詞項(xiàng)的文檔進(jìn)行相關(guān)度算分
GET?/es_db/_search
{"query":{"term":{"address":{"value":"廣州白云"}}}}
- 可以通過(guò)?Constant?Score?將查詢(xún)轉(zhuǎn)換成一個(gè)?Filtering,避免算分,并利用緩存,提高性能
- 將 Query?轉(zhuǎn)成?Filter,忽略 TF-IDF 計(jì)算,避免相關(guān)性算分的開(kāi)銷(xiāo)
- Filter 可以有效利用緩存
GET?/es_db/_search
{"query":{"constant_score":{"filter":{"term":{"address.keyword":"廣州白云山公園"}}}}}
結(jié)構(gòu)化搜索
- 結(jié)構(gòu)化搜索 (Structured?search) 是指對(duì)結(jié)構(gòu)化數(shù)據(jù)的搜索
- 結(jié)構(gòu)化數(shù)據(jù)
- 日期,布爾類(lèi)型和數(shù)字都是結(jié)構(gòu)化的
- 文本也可以是結(jié)構(gòu)化的
- 如彩色筆可以有離散的顏色集合:紅 (red)?、綠 (green)、藍(lán) (blue)
- 一個(gè)博客可能被標(biāo)記了標(biāo)簽,例如,分布式 (distributed) 和搜索 (search)
- 電商網(wǎng)站上的商品都有 UPC (通用產(chǎn)品碼 Universal?Product?Code) 或其他的唯一
- 它們都需要遵從嚴(yán)格規(guī)定的、結(jié)構(gòu)化的格式
- 應(yīng)用場(chǎng)景:對(duì) bool,日期,數(shù)字,結(jié)構(gòu)化的文本可以利用 term 做精確匹配
- term 處理多值字段
前綴查詢(xún) prefix
- 它會(huì)對(duì)分詞后的 term 進(jìn)行前綴搜索
- 它不會(huì)分析要搜索的字符串,傳入的前綴就是想要查找的前綴
- 默認(rèn)狀態(tài)下,前綴查詢(xún)不做相關(guān)度分?jǐn)?shù)計(jì)算,它只是將所有匹配的文檔返回,然后賦予所有相關(guān)分?jǐn)?shù)值為1
- 它的行為更像是一個(gè)過(guò)濾器而不是查詢(xún)
- 兩者實(shí)際的區(qū)別就是過(guò)濾器是可以被緩存的,而前綴查詢(xún)不行
- prefix 的原理:需要遍歷所有倒排索引,并比較每個(gè) term 是否已所指定的前綴開(kāi)頭
GET?/es_db/_search
{"query":{"prefix":{"address":{"value":"廣州"}}}}
通配符查詢(xún) wildcard
- 通配符查詢(xún):工作原理和 prefix 相同,只不過(guò)它不是只比較開(kāi)頭,它能支持更為復(fù)雜的匹配模式
GET?/es_db/_search
{"query":{"wildcard":{"address":{"value":"*白*"}}}}
范圍查詢(xún) range
- range 范圍關(guān)鍵字
- gte 大于等于
- lte 小于等于
- gt 大于
- lt 小于
- now 當(dāng)前時(shí)間
POST?/es_db/_search
{"query":{"range":{"age":{"gte":25,"lte":28}}}}
GET?/product/_search
{"query":{"range":{"date":{"gte":"now‐2y" }}}}
多 id 查詢(xún) ids
- ids?關(guān)鍵字?:?值為數(shù)組類(lèi)型,用來(lái)根據(jù)一組 id 獲取多個(gè)對(duì)應(yīng)的文檔
GET?/es_db/_search
{"query":{"ids":{"values":[1,2]}}}
模糊查詢(xún) fuzzy
- 使用 fuzziness 屬性來(lái)進(jìn)行模糊查詢(xún),從而達(dá)到搜索有錯(cuò)別字的情形
- fuzzy?查詢(xún)會(huì)用到兩個(gè)很重要的參數(shù),fuzziness,prefix_length
- fuzziness:表示輸入的關(guān)鍵字通過(guò)幾次操作可以轉(zhuǎn)變成為 ES 庫(kù)里面的對(duì)應(yīng) field 的字段
- 操作是指:新增一個(gè)字符,刪除一個(gè)字符,修改一個(gè)字符,每次操作可以記做編輯距離為 1
- 如中文集團(tuán)到中威集團(tuán)編輯距離就是1,只需要修改一個(gè)字符
- 該參數(shù)默認(rèn)值為0,即不開(kāi)啟模糊查詢(xún)
- prefix_length:表示限制輸入關(guān)鍵字和ES對(duì)應(yīng)查詢(xún)field的內(nèi)容開(kāi)頭的第n個(gè)字符必須完全匹配,不允許錯(cuò)別字匹配
- 如這里等于1,則表示開(kāi)頭的1個(gè)字必須匹配,不匹配則不返回
- 默認(rèn)值也是0
- 加大prefix_length的值可以提高效率和準(zhǔn)確率
- fuzzy?模糊查詢(xún)?最大模糊錯(cuò)誤?必須在0-2之間
- 搜索關(guān)鍵詞長(zhǎng)度為?2,不允許存在模糊
- 搜索關(guān)鍵詞長(zhǎng)度為3-5,允許1次模糊
- 搜索關(guān)鍵詞長(zhǎng)度大于5,允許最大2次模糊
GET?/es_db/_search
{"query":{"fuzzy":{"address":{"value":"白運(yùn)山","fuzziness":1}}}}
高亮 highlight
- highlight?關(guān)鍵字:可以讓符合條件的文檔中的關(guān)鍵詞高亮
- pre_tags?前綴標(biāo)簽
- post_tags?后綴標(biāo)簽
- tags_schema?設(shè)置為styled可以使用內(nèi)置高亮樣式
- require_field_match?多字段高亮需要設(shè)置為false
GET?/products/_search
{"query":{"term":{"name":{"value":"牛仔"}}},"highlight":{"fields":{"*":{}}}}
- 自定義高亮 html 標(biāo)簽
- 可以在 highlight 中使用 pre_tags 和 post_tags
- 多字段高亮:require_field_match 設(shè)置為 false
GET?/products/_search
{"query":{"term":{"name":{"value":?"牛仔"}}},"highlight":{"post_tags":["</span>"],"pre_tags":["<span?style='color:red'>"], # 多字段高亮"require_field_match":"false","fields":{"*":{}}}}