[Elasticsearch] 控制相關度 (四) - 忽略TF/IDF

本章翻譯自Elasticsearch官方指南的Controlling Relevance一章。html


 

忽略TF/IDF

有時咱們不須要TF/IDF。咱們想知道的只是一個特定的單詞是否出如今了字段中。好比咱們正在搜索度假酒店,但願它擁有的賣點越多越好:json

  • WiFi
  • 花園(Garden)
  • 泳池(Pool)

而關於度假酒店的文檔相似下面這樣:緩存

{ "description": "A delightful four-bedroomed house with ... " }

可使用一個簡單的match查詢:elasticsearch

GET /_search
{
  "query": { "match": { "description": "wifi garden pool" } } }

然而,咱們須要的並非真正的全文搜索。此時TF/IDF只會礙手礙腳。咱們不在乎wifi是不是一個常見的詞條,也不在乎它在文檔中出現的是否頻繁。咱們在乎的只是它是否出現了。實際上,咱們只是想經過賣點來對這些度假酒店進行排序 - 越多越好。若是擁有一個賣點,那麼它的分值就是1,若是沒有它的分值就是0。ide

constant_score查詢

首先介紹constant_score查詢。該查詢可以包含一個查詢或者一個過濾器,全部匹配文檔的相關度分值都爲1,不考慮TF/IDF:ui

GET /_search
{
  "query": { "bool": { "should": [ { "constant_score": { "query": { "match": { "description": "wifi" }} }}, { "constant_score": { "query": { "match": { "description": "garden" }} }}, { "constant_score": { "query": { "match": { "description": "pool" }} }} ] } } }

大概並非全部的賣點都同等重要 - 其中的某些更有價值。若是最看中的賣點是泳池,那麼咱們能夠對它進行相應提高:spa

GET /_search
{
  "query": { "bool": { "should": [ { "constant_score": { "query": { "match": { "description": "wifi" }} }}, { "constant_score": { "query": { "match": { "description": "garden" }} }}, { "constant_score": { "boost": 2 "query": { "match": { "description": "pool" }} }} ] } } }

NOTE翻譯

每一個結果的最終分值並非將全部匹配子句的分值累加而獲得。Coordination因子查詢歸約因子(Query Normalization Factor)仍然會被考慮在內。orm

咱們能夠在度假酒店的文檔中添加一個not_analyzed類型的features字段:htm

{ "features": [ "wifi", "pool", "garden" ] }

默認狀況下,一個not_analyzed字段的字段長度歸約(Field-length Norm)是被禁用的,同時其index_options也會被設置爲docs,從而禁用詞條頻度(Term Frequencies),可是問題仍是存在:每一個詞條的倒排文檔頻度(Inverse Document Frequency)仍然會被考慮。

仍然使用constant_score查詢:

GET /_search
{
  "query": { "bool": { "should": [ { "constant_score": { "query": { "match": { "features": "wifi" }} }}, { "constant_score": { "query": { "match": { "features": "garden" }} }}, { "constant_score": { "boost": 2 "query": { "match": { "features": "pool" }} }} ] } } }

實際上,每一個賣點都應該被視爲一個過濾器。度假酒店要麼有該賣點,要麼沒有 - 使用過濾器彷佛是更天然的選擇。而且若是咱們使用了過濾器,還能夠得益於過濾器緩存這一功能。

不使用過濾器的根源在於:過濾器不會計算相關度分值。咱們須要的是一座用來鏈接過濾器和查詢的橋樑。而function_score查詢就可以作到這一點,而且它也提供了更多的功能。

相關文章
相關標籤/搜索