translate by williamzhao
前面我們講到的是關(guān)于結(jié)構(gòu)化查詢語句,事實(shí)上我們可以使用兩種結(jié)構(gòu)化語句: 結(jié)構(gòu)化查詢(Query DSL)和結(jié)構(gòu)化過濾(Filter DSL)。 查詢與過濾語句非常相似,但是它們由于使用目的不同而稍有差異。
一條過濾語句會(huì)詢問每個(gè)文檔的字段值是否包含著特定值:
created
的日期范圍是否在 2013
到 2014
?
status
字段中是否包含單詞 "published" ?
lat_lon
字段中的地理位置與目標(biāo)點(diǎn)相距是否不超過10km ?一條查詢語句與過濾語句相似,但問法不同:
查詢語句會(huì)詢問每個(gè)文檔的字段值與特定值的匹配程度如何?
查詢語句的典型用法是為了找到文檔:
查找與 full text search
這個(gè)詞語最佳匹配的文檔
查找包含單詞 run
,但是也包含runs
, running
, jog
或 sprint
的文檔
同時(shí)包含著 quick
, brown
和 fox
--- 單詞間離得越近,該文檔的相關(guān)性越高
lucene
, search
或 java
--- 標(biāo)識(shí)詞越多,該文檔的相關(guān)性越高一條查詢語句會(huì)計(jì)算每個(gè)文檔與查詢語句的相關(guān)性,會(huì)給出一個(gè)相關(guān)性評(píng)分 _score
,并且
按照相關(guān)性對(duì)匹配到的文檔進(jìn)行排序。
這種評(píng)分方式非常適用于一個(gè)沒有完全配置結(jié)果的全文本搜索。
使用過濾語句得到的結(jié)果集 -- 一個(gè)簡(jiǎn)單的文檔列表,快速匹配運(yùn)算并存入內(nèi)存是十分方便的, 每個(gè)文檔僅需要1個(gè)字節(jié)。這些緩存的過濾結(jié)果集與后續(xù)請(qǐng)求的結(jié)合使用是非常高效的。
查詢語句不僅要查找相匹配的文檔,還需要計(jì)算每個(gè)文檔的相關(guān)性,所以一般來說查詢語句要比 過濾語句更耗時(shí),并且查詢結(jié)果也不可緩存。
幸虧有了倒排索引,一個(gè)只匹配少量文檔的簡(jiǎn)單查詢語句在百萬級(jí)文檔中的查詢效率會(huì)與一條經(jīng)過緩存 的過濾語句旗鼓相當(dāng),甚至略占上風(fēng)。 但是一般情況下,一條經(jīng)過緩存的過濾查詢要遠(yuǎn)勝一條查詢語句的執(zhí)行效率。
過濾語句的目的就是縮小匹配的文檔結(jié)果集,所以需要仔細(xì)檢查過濾條件。
原則上來說,使用查詢語句做全文本搜索或其他需要進(jìn)行相關(guān)性評(píng)分的時(shí)候,剩下的全部用過濾語句