說一千,道一萬,我們最終使用ES還是要使用es的查詢功能
1 Lucene是如何評分的
文檔得分,就是文檔和查詢匹配的程度,Lucene的默認評分機制是 TF/IDF(詞頻/逆文檔頻率)算法
不管什么評分機制,最基本的因子在底層是不變的
評分因子有:
文檔權重(document boost),字段權重(field boost),協(xié)調因子(coord),逆文檔頻率(inverse document frequency),長度范數(shù)(length norm),詞頻(term frequency)查詢范數(shù)(query norm)
比較容易理解的概念有 文檔權重,字段權重
其他幾個需要一定的理解
- 協(xié)調因子(coord):基于文檔中詞項命中個數(shù)的協(xié)調因子,一個文檔命中了查詢中的詞項越多,得分越高
- 逆文檔頻率(inverse document frequency):一個基于詞項的因此,用來告訴評分公式,該詞項是多么的罕見,頻率越低,越罕見,這樣公式可以通過此因子對罕見詞項的文檔進行加權
- 長度范數(shù)(length norm):在索引期計算得基于詞項個數(shù)的歸一化因子,詞項越多,因子權重越低,即Lucene更喜歡包含更少詞項的字段
- 詞頻(term frequency);基于詞項的因子,詞頻越高,得分越高
- 查詢范數(shù)(query norm):基于查詢的歸一化因子,詞項權重的平方和,讓不同查詢的得分可以互相比較,但通常是困難且不可行的
2.TF/IDF評分公式
忽略理論,直接看實際的公式
score(q,d) =queryNorm(q) · coord(q,d)
· ∑ ( tf(t in d) · idf(t)2 · t.getBoost()· norm(t,d) )
(t in q)
3.查詢改寫
參考文檔《深入理解ElasticSearch》,當時是根據(jù)版本0.9寫的書,很多東西可能過時了,但我覺得這些查詢改寫等思想,其實是后續(xù)版本優(yōu)化對人不可見了。本質上并沒有變
查詢改寫就是出于性能的考慮,對查詢進行優(yōu)化,把原始的查詢改寫為性能更高的查詢類型
4.關于緩存
- ES的緩存,有索引級和節(jié)點級,由于分片的存在,因此索引級的緩存不建議,默認是節(jié)點級
- ES的緩存主要分為過濾緩存和字段數(shù)據(jù)緩存
過濾緩存
緩存的配置主要包括容量,過期時間,淘汰策略等字段數(shù)據(jù)緩存
這個就是ES設計字段數(shù)據(jù)排序或切面計算時使用,ES做的就是加載相關字段全部數(shù)據(jù)到內存中。但這非常消耗性能,尤其是某個字段擁有大量不同的詞項
但字段緩存支持過濾功能,以減輕硬件負擔
過濾策略主要有3種:基于詞頻,基于正則表達式以及兩者的組合。這些是在創(chuàng)建mapping的時候指定的字段屬性
詞頻:基于詞頻過濾的結果是指加載哪些高于指定頻率的詞項,太低頻率的詞項過濾結果就不緩存了
實際舉例:tag字段保存文檔數(shù)不小于100的索引段,且詞頻在0.01到0.2之間
"book":{
"properties":{
"tag":{
"type":"string",
"fielddate":{
"fielter":{
"frenquency":{
"min":"0.01",
"max":"0.2",
"min_segment_size":100
}}}}}}