2-2、深入搜尋 -基於詞項和基於全文的搜尋
阿新 • • 發佈:2021-08-16
1. 基於詞項和基於全文的搜尋
-
基於 Term 的查詢
Term 是表達語意的最⼩單位。搜尋和利⽤統計語⾔模型進⾏⾃然語⾔處理都需要處理 Term
-
特點
- Term Level Query: Term Query / Range Query / Exists Query / Prefix Query /Wildcard Query
- 在 ES 中,Term 查詢,對輸⼊不做分詞。會將輸⼊作為⼀個整體,在倒排索引中查詢準確的詞項,並
且使⽤相關度算分公式為每個包含該詞項的⽂檔進⾏相關度算分 – 例如“Apple Store” - 可以通過 Constant Score 將查詢轉換成⼀個 Filtering,避免算分,並利⽤快取,提⾼效能
-
例子
建立index products_test
關於Term 查詢的例子 POST /products_test/product/_bulk { "index": { "_id": 1 }} { "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" } { "index": { "_id": 2 }} { "productID" : "KDKE-B-9947-#kL5","desc":"iPad" } { "index": { "_id": 3 }} { "productID" : "JODL-X-1937-#pV7","desc":"MBP" } POST /products_test/_search { "query": { "term": { "desc.keyword": { //"value": "iPhone" 查不到結果 //"value":"iphone" 可以查到 } } } } 上面查詢分別返回什麼?
term 查詢 欄位不分詞 ,可以再mapping 中設定 keyword
- 複合查詢 Constant Score 轉為 Filter
- 將 Query 轉成 Filter,忽略 TF-IDF 計算,避免相關性算分的開銷
- Filter 可以有效利⽤快取
POST /products_test/_search { //"explain": true, "query": { "constant_score": { // 忽視計算分數帶來的效能影響 "filter": { "term": { "productID.keyword": "XHDK-A-1293-#fJ3" } } } } }
基於全文的查詢
- 基於全⽂本的查詢
- Match Query / Match Phrase Query / Query String Query
- 特點
- 索引和搜尋時都會進⾏分詞,查詢字串先傳遞到⼀個合適的分詞器,然後⽣成⼀個供查詢的詞
項列表 - 查詢時候,先會對輸⼊的查詢進⾏分詞,然後每個詞項逐個進⾏底層的查詢,最終將結果進⾏合
並。併為每個⽂檔⽣成⼀個算分。- 例如查 “Matrix reloaded”,會查到包括 Matrix 或者 reload
的所有結果。
- 索引和搜尋時都會進⾏分詞,查詢字串先傳遞到⼀個合適的分詞器,然後⽣成⼀個供查詢的詞
post product_test/_search
{
"query":{
"match":{
"desc":{
"query":"dejxv"
}
}
}
}
match 與 match_phrase 區別?