es filter过滤器_Elasticsearch 之 Filter 与 Query 有啥不同?
今天來了解下 Elasticsearch(以下簡稱 ES) 中的 Query 和 Filter。
在 ES 中,提供了 Query 和 Filter 兩種搜索:
- Query Context:會對搜索進行相關(guān)性十分
- Filter Context:不需要相關(guān)性算分,能夠利用緩存來獲得更好的性能
舉一個例子,比如需要搜索一場電影,包含以下信息:
評論中包含了燒腦,評分高于 8 分,同時上映時間在 2010 到 2020 之間。
所以這個搜索包括了三個判斷邏輯,針對三個不同的字段進行查詢,如果需要滿足這樣的查詢需求,在 ES 當(dāng)中提供了 bool 查詢,一個 bool 查詢可以包含一個或多個查詢字句,支持以下四種查詢:
- must:必須匹配,貢獻算分
- should:選擇性匹配,貢獻算分
- must_not:查詢字句,必須不能匹配
- filter:必須匹配,不貢獻算分
上圖是一個 bool 查詢,是對用戶(user)進行搜索,城市必須是北京(beijing) ,性別必須是男(man),這個采用的是 filter,說明這個對算分是不會產(chǎn)生影響的,must_not 是一個 range 的查詢:年齡大于等于 35 歲;should 里是一個數(shù)組,說明這個 should 中可以寫多個條件,只要用戶的名字是這兩個中的一個就是滿足條件的。
其實,bool 查詢的子查詢可以任意順序出現(xiàn),并且可以嵌套多個查詢。
另外,should 的使用分兩種情況:
- bool 查詢中只包含 should,不包含 must 查詢
- bool 查詢中同時包含 should 和 must 查詢
下面讓我們來看看這兩種情況有何不同?
如果在 bool 查詢中沒有 must 子句,should 中必須至少滿足一條查詢(可以通過 minimum_should_match 來設(shè)置滿足條件的個數(shù)或者百分比)。
同時包含 should 和 must 時,文檔不必滿足 should 中的條件,但是如果滿足條件,會增加相關(guān)性算分。
Filter Context
上面說到了 filter 和 must_not 是不會影響算分的,通過查詢結(jié)果中可以看到 _score 都是 0。
Query Context
采用 should 查詢,會進行算分處理,結(jié)果如下圖所示:
同時,查詢語句的結(jié)構(gòu),也會對相關(guān)度算分產(chǎn)生影響:
- 同一層級的查詢字段,權(quán)重是相同的
- 通過嵌套 bool 查詢,可以改變對算分的影響
Boost & Boosting Query
相關(guān)度還可以通過對某個字段設(shè)置 boost 的值來進行控制:
- 當(dāng) boost > 1 時,打分的相關(guān)度相對性提升
- 當(dāng) 0 < boost < 1 時,打分的權(quán)重相對性降低
- 當(dāng) boost < 0 時,貢獻負分
或者使用 ES 提供的 Boosting Query 進行查詢:
首先插入幾條數(shù)據(jù)用于測試:
POST?/product/_bulk{?"index":?{?"_id":?1?}}{?"content":"Apple?Mac"?}{?"index":?{?"_id":?2?}}{?"content":"Apple?iPad"?}{?"index":?{?"_id":?3?}}{?"content":"Apple?Juice"?}如下圖所示,左邊就是一個 Boosting Query,positive 查詢意思是如果 content中包含 Apple 會按照原始的相關(guān)性分數(shù)進行打分,negative 查詢則是滿足 positive 查詢同時滿足 negative 查詢(content 中包含 Juice)的會按照原始的相關(guān)性分數(shù)乘以 negative_boost 進行打分,negative_boost 是用于降低與 negative 匹配文檔的相關(guān)性算分的。
如右圖所示,這個的查詢結(jié)果為三條數(shù)據(jù),可以發(fā)現(xiàn) Apple Mac 和 Apple iPad的相關(guān)性算分相同,都排在前面,而有Apple Juice 的相關(guān)性算分是其他兩個的 0.1 倍,排在最后。
用一個表格來總結(jié)下 Query Context 和 Filter Context 的區(qū)別:
Context Type含義使用方式Query查找與查詢語句最匹配的文檔,對所有文檔進行相關(guān)性算分并排序query;bool 中的 must 和 shouldFilter查找與查詢語句相匹配的文檔bool 中的 filter 和 must_not;constant_score 中的 filter
filter 不需要計算相關(guān)性算分,不需要按照相關(guān)分數(shù)進行排序,同時還有內(nèi)置的自動 cache 最常使用的 filter 的數(shù)據(jù),而 query 相反,需要計算相關(guān)性算分,按照分數(shù)進行排序,而且無法 cache 結(jié)果,因此在某些不需要相關(guān)性算分的查詢場景,盡量使用 Filter Context 來讓查詢更加高效。
下圖為 eBay 對于 Filter Context 和 Query Context 的性能比較:
Filter Context VS Query Context
那么 filter 的 cache 是怎么做的呢?
ES 會構(gòu)建一個文檔匹配過濾器的位置 bitset(用來標(biāo)識一個文檔對一個 filter 條件是否匹配,如果匹配就是 1,不匹配就是 0),下次再有這個 filter 條件過來的時候就不用重新掃描倒排索引,反復(fù)生成 bitset,可以大幅度提升性能,另外當(dāng)添加或更新文檔時,這個 filter 的位集 bitset 也會更新。
總結(jié)
當(dāng)用戶輸入多個條件進行查詢的時候,可以使用 bool 查詢,在 bool 查詢中,filter 和 must_not 屬于 Filter Context,不會對算分結(jié)果產(chǎn)生影響;must 和 should 屬于 Query Context,會對結(jié)果算分產(chǎn)生影響。
在 bool 查詢中,查詢結(jié)構(gòu)是對相關(guān)性算分有影響的,可以通過嵌套的方式修改不同字段在查詢中的權(quán)重以及直接通過指定字段的 boost 值來控制在搜索中的權(quán)重,另外使用 Boosting Query 可以提升搜索的精準(zhǔn)性,同時也可以將更多的搜索顯示在結(jié)果中。
總結(jié)
以上是生活随笔為你收集整理的es filter过滤器_Elasticsearch 之 Filter 与 Query 有啥不同?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 假牙和真牙感觉一样吗
- 下一篇: mysql增删改查的命令_MySql增删