ElasticSearch学习总结(三):查询总结
ElasticSearch學(xué)習(xí)總結(jié)(三):查詢總結(jié)
本文主要對(duì)Elasticsearch中查詢相關(guān)的知識(shí)做一個(gè)簡(jiǎn)單的總結(jié),內(nèi)容主要包括查詢的評(píng)分機(jī)制,查詢改寫,過(guò)濾器,以及對(duì)常見(jiàn)的查詢做一個(gè)簡(jiǎn)單的分類
1. 評(píng)分機(jī)制
在Lucense中默認(rèn)使用TF/IDF算法對(duì)文檔進(jìn)行評(píng)分,該算法已經(jīng)在前文做了簡(jiǎn)單的介紹,這里主要總結(jié)下什么樣的因素可能得到高分?
1. 越罕見(jiàn)的詞被匹配上,得分越高。?
2. 文檔字段越短(包含更少的詞項(xiàng)),文檔的得分越高?
3. 權(quán)重越高(可以是索引期或是查詢期賦予的權(quán)重),得分越高
Elasticsearch 提供的評(píng)分算法比較豐富(默認(rèn)為BM25),可以通過(guò)similarity進(jìn)行配置,可配置的項(xiàng)目包括:?
1. BM25?
2. Classic(基于TF/IDF)?
3. DFR/DFI?
4. IB?
5. ….?
關(guān)于每個(gè)算法的介紹以及可配置參數(shù)可以參見(jiàn):https://www.elastic.co/guide/en/elasticsearch/reference/5.2/index-modules-similarity.html
另外需要注意的是除了使用similarity進(jìn)行評(píng)分的控制之外,還可以通過(guò)function_score,constant_score,rescore 等多種機(jī)制對(duì)評(píng)分進(jìn)行更加精確的控制。
2. 查詢改寫
在進(jìn)行==前綴查詢==或是==通配符查詢==時(shí),實(shí)際上會(huì)轉(zhuǎn)化為對(duì)多個(gè)關(guān)鍵詞的查詢,處于性能優(yōu)化的考慮,Lucene會(huì)把這種查詢轉(zhuǎn)化為一組開(kāi)銷較小的查詢方式,采取的主要手段便是“查詢改寫(rewrite)”
查詢改寫使用的主要策略為通過(guò)使用常量得分查詢(constant score query)來(lái)代替常規(guī)查詢來(lái)減少查詢時(shí)性能的開(kāi)銷,對(duì)于可能匹配term較多的查詢時(shí),性能提升尤為明顯。
在查詢改寫的過(guò)程中可以根據(jù)需要自定義改寫的方式,可支持的配置如下
- scoring_boolean:該選項(xiàng)將每個(gè)生成的詞項(xiàng)轉(zhuǎn)化為布爾查詢中的一個(gè)或從句(Boolean should clause)。這種改寫方法需要針對(duì)每個(gè)文檔都計(jì)算得分。因此,這種方法比較耗費(fèi)CPU,而且有些查詢生成了太多的詞項(xiàng),以至于超出了布爾查詢默認(rèn)的1024個(gè)從句的限制。默認(rèn)的布爾查詢限制可以通過(guò)設(shè)置Elasticsearch.yml文件的index.query.bool.max_clause_count屬性來(lái)修改。改寫后的布爾查詢的從句數(shù)越多,查詢性能越低
- constant_score_boolean:該選項(xiàng)與前面提到過(guò)的scoring_boolean類似,但是CPU耗費(fèi)更少,這是因?yàn)椴⒉挥?jì)算每個(gè)從句的得分,而是每個(gè)從句得到一個(gè)與查詢權(quán)重相同的一個(gè)常數(shù)得分,默認(rèn)情況下等于1,我們也可以通過(guò)設(shè)置查詢權(quán)重來(lái)改變這個(gè)默認(rèn)值。與scoring_boolean類似,該選項(xiàng)也有布爾從句數(shù)的限制。
- constant_score(==默認(rèn)選項(xiàng)==):在匹配的詞項(xiàng)較少時(shí),與constant_score_boolean類似,匹配的詞項(xiàng)較多時(shí),會(huì)遍歷并查詢所有的詞項(xiàng),然后使用相同的常數(shù)得分。
- top_terms_N:與scoring_boolean相似之處在于都會(huì)對(duì)從句計(jì)算得分,不同之處在于,該方法只保留最佳的N個(gè)詞項(xiàng),以避免觸及布爾從句數(shù)的限制,并提升查詢整體性能。
- top_terms_boost_N:該選項(xiàng)與top_terms_N類似,不同之處在于它的文檔得分不是通過(guò)計(jì)算得出的,而是被設(shè)置為跟查詢權(quán)重(boost)一致,默認(rèn)值為1。
對(duì)于如何選擇rewrite配置的問(wèn)題,可以遵循如下原則?
- 如果您能接受較低的精度和相關(guān)性(但是追求更高的性能),那么可以采用top-N查詢改寫方法。?
- 如果您需要更高的查詢精度和更好的相關(guān)性(同時(shí)可以接受較低的性能),那么應(yīng)該采用布爾方法。
3. 過(guò)濾器
3.1 過(guò)濾器的作用
Elsaticsearch在提供了豐富查詢功能的同時(shí),還提供了過(guò)濾器的功能,過(guò)濾器的作用顧名思義,主要用來(lái)對(duì)查詢結(jié)果過(guò)濾,但過(guò)濾的過(guò)程中不會(huì)涉及到store的計(jì)算性能損耗(是不會(huì)對(duì)已有查詢的store造成影響),同時(shí)頻繁使用的過(guò)濾器還會(huì)被Elasticsearch自動(dòng)的緩存,總而提高查詢的性能。
3.2 工作原理
過(guò)濾器持有的關(guān)于文檔的唯一重要信息是該文檔是否匹配這個(gè)過(guò)濾器(僅僅一個(gè)標(biāo)記而已)
過(guò)濾器通過(guò)返回一個(gè)被稱為DocIdSet(org.apache.lucene.search.DocIdSet)的數(shù)據(jù)結(jié)構(gòu)來(lái)提供匹配信息。這個(gè)數(shù)據(jù)結(jié)構(gòu)的用途是為索引段提供經(jīng)過(guò)濾器過(guò)濾后的數(shù)據(jù)。它可以使用Bits接口(org.apache.lucene.util.Bits)的有關(guān)實(shí)現(xiàn)。Bits接口可以隨機(jī)訪問(wèn)過(guò)濾器中的文檔信息(主要是檢查索引段中的某個(gè)文檔是否和該過(guò)濾器匹配)。
Bits的數(shù)據(jù)結(jié)構(gòu)非常高效,因?yàn)镃PU可以使用位運(yùn)算來(lái)完成過(guò)濾
下面的表格展示了Bits接口的工作方式
| 1 | False | ? |
| 2 | False | ? |
| 3 | True | 3 |
| 4 | True | 4 |
Elasticsearch和Lucene可以根據(jù)不同的使用場(chǎng)景選擇不同的DocIdSet實(shí)現(xiàn),不是所有的過(guò)濾器都使用Bits結(jié)構(gòu),比如數(shù)值區(qū)間過(guò)濾器、腳本過(guò)濾器、以及基于地理位置的一組過(guò)濾器。這些特殊的過(guò)濾器選擇把數(shù)據(jù)記錄在字段緩存里,然后再遍歷所需處理的文檔集合,逐個(gè)進(jìn)行過(guò)濾操作。這意味著過(guò)濾器鏈條中的下一個(gè)過(guò)濾器只能獲取到匹配前一個(gè)過(guò)濾器的文檔集合。因此,可以針對(duì)這些過(guò)濾器進(jìn)行優(yōu)化,比如把最重的(匹配文檔最多的,或者性能最差的)過(guò)濾器放到過(guò)濾器鏈的最后去執(zhí)行。
4. 查詢的分類
本章節(jié)主要總結(jié)Elasticsearch支持的常見(jiàn)查詢類型并進(jìn)行分類,由于Elasticsearch的查詢功能較多,本部分只會(huì)選擇性的進(jìn)行說(shuō)明,具體使用方法與參數(shù)可以參見(jiàn)官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl.html
4.1 查詢方法
在不使用API的情況下,可以使用兩種方式對(duì)數(shù)據(jù)進(jìn)行查詢
- URL查詢
- 1
- 2
- Request Body 查詢
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4.2 查詢分類
4.2.1 基本查詢
這類查詢通常作為其他復(fù)雜查詢的一部分,或是單獨(dú)傳遞給Elasticsearch進(jìn)行查詢
- match查詢:該查詢會(huì)對(duì)==查詢?cè)~==進(jìn)行分詞,分詞后查詢語(yǔ)句中的任何一個(gè)詞項(xiàng)被匹配,文檔就會(huì)被搜索到。
- match_all查詢:該查詢會(huì)返回所有的文檔。
- term查詢:該查詢的查詢?cè)~==不會(huì)被分詞==。只有文檔中的詞和查詢?cè)~精確匹配時(shí)才會(huì)被搜索到。
- query_string查詢:該查詢?cè)试S在一個(gè)查詢中使用多個(gè)特殊的條件關(guān)鍵字進(jìn)行查詢(例如 AND|OR|NOT)對(duì)多個(gè)字段進(jìn)行查詢
- 其他:match,multi_match,fuzzy_like_this,ids,query_string,simple_query_string,range,prefix,term,terms等等
4.2.2 組合查詢
該種類型的查詢可以嵌入其他查詢以及過(guò)濾器?
- bool查詢:比較常用的組合查詢,可以把多個(gè)查詢用布爾邏輯組織在一起。?
- dis_max查詢:該種查詢的結(jié)果文檔得分和最高權(quán)重的子查詢打分高度相關(guān),如果希望最高得分的子查詢能夠在打分過(guò)程中起決定性的作用,可以使用該類查詢?
- 其他:bool,boosting,dis_max,has_child,nested,span-XXX等
4.2.3 無(wú)分析查詢
該種類型的輸入不會(huì)被分析,而是直接原樣傳遞給lucene
相關(guān)查詢主要包括:term,common,ids,prefix,wildcard等等
4.2.4 全文檢索查詢
當(dāng)需要構(gòu)建類似于Google這樣的查詢時(shí),可以使用該類查詢,該類查詢會(huì)根據(jù)輸入與配置進(jìn)行查詢結(jié)果的打分操作。?
相關(guān)查詢主要包括:match,multi_match,query_string,simple_query_string等
4.2.5 模式匹配查詢
顧名思義,該類查詢主要是用來(lái)支持通配符查詢的。需要注意的是該類查詢的資源損耗一般都比較大
相關(guān)查詢主要包括:prefix,regrex,wildcard
4.2.6 相似度查詢
該類查詢典型的應(yīng)用場(chǎng)景為近似詞查詢,或是提供類似于Google的”你想找的是不是XXX”的功能
相關(guān)查詢主要包括:fuzzy_like_this,fuzzy_like_this_field,more_like_this等
4.2.7 打分相關(guān)的查詢
該類查詢可以通過(guò)自定義權(quán)重的方式來(lái)改善查詢精度或是查詢得分。
相關(guān)查詢主要包括:boosting,constant_score,function_score,indices
4.2.8 位置敏感查詢
可以使用索引中存儲(chǔ)的詞項(xiàng)位置作為查詢條件的查詢,例如 “需要查詢masting以及elasticsearch兩個(gè)詞項(xiàng),且這連個(gè)單詞相互臨近,順序必須是masting在前面,前后距離還不超過(guò)3個(gè)位置”
該類查詢的開(kāi)銷也很大,需要消耗大量的CPU資源
相關(guān)查詢主要包括:match_phrase,span_XXX
4.2.9 結(jié)構(gòu)敏感查詢
該種類型的查詢可以提供類似于SQL中Join的關(guān)系查詢?
- nested查詢:文檔中可以包含嵌套類型的字段,這些字段可以用來(lái)索引一些數(shù)組對(duì)象,每個(gè)對(duì)象都可以單獨(dú)的查詢,詳細(xì)細(xì)節(jié)可以參考官方文檔的nested類型(https://www.elastic.co/guide/en/elasticsearch/reference/5.2/nested.html),以及nested查詢(https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-nested-query.html)
- 其他: has_child,has_parent
4.2.10 地理位置查詢
該類查詢主要針對(duì)geo_point的查詢以及geo_shape
相關(guān)查詢主要包括:geo_distance,geo_bounding_box,geo_polygon,geo_shape
4.2.11 搜索高亮查詢
該類查詢主要通過(guò)對(duì)查詢結(jié)果使用默認(rèn)標(biāo)簽()或是自定義標(biāo)簽的方式來(lái)實(shí)現(xiàn)查詢結(jié)果高亮的應(yīng)用場(chǎng)景
相關(guān)查詢主要包括:highlighter,fast_vector_highlighter
4.2.12 搜索排序
Elasticsearch中默認(rèn)的查詢結(jié)果是按照評(píng)分排序的,可以使用sort進(jìn)行排序
4.2.13 其他
- script查詢:可以使用腳本進(jìn)行查詢
- percolate查詢:該類查詢需要先注冊(cè)查詢條件,然后更具文檔來(lái)查詢條件,常見(jiàn)的使用場(chǎng)景包括:數(shù)據(jù)分類,數(shù)據(jù)路由,時(shí)間監(jiān)控等
總結(jié)
以上是生活随笔為你收集整理的ElasticSearch学习总结(三):查询总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tf-idf:信息检索
- 下一篇: 相比 App,Web 开发竟更适合初创公