ElasticSearch--以屬性爲中心的查詢

在實體查詢中,我感興趣是最匹配的項,而不是說最匹配的屬性,這個在Most_fileds 或者best_fields都是以屬性爲中心的查詢。

問題1:在多個屬性中匹配同樣的單詞

考慮most_fields查詢是怎麼執行的:ElasticSearch對每一個屬性生成一個match query 然後把這些query 包括在bool query 中。
我們用validate-query API看一下

GET /_validate/query?explain
{
  "query": {
    "multi_match": {
      "query":   "Poland Street W1V",
      "type":    "most_fields",
      "fields":  [ "street", "city", "country", "postcode" ]
    }
  }
}

你可以看到一個文檔匹配一個單詞poland在兩個屬性中的相關度分值score會高於一個文檔在一個屬性匹配pland和street兩個單詞。

問題2:修剪長尾巴

我們可以用and 操作 和 minimum_should_match 參數去修剪一個很長的且不太相關的查詢結果。可能我們可以這樣:

{
    "query": {
        "multi_match": {
            "query":       "Poland Street W1V",
            "type":        "most_fields",
            "operator":    "and", 
            "fields":      [ "street", "city", "country", "postcode" ]
        }
    }
}

也就是說,用and operator 意味着單詞必須存在於同樣的屬性中,這樣是絕對錯誤的,不滿足我們的需求。

問題3:Term Frequencies

我們討論缺省的相似度算法去計算相關度:tf/idf
Term Frequency
越多的term出現在一個文檔中,則意味着越大的相關度
Inverse document frequency
越多的term出現在某個field 在全部的文檔中,則越少的相關度
當我們搜索多個field時,tf/idf會帶來一些驚喜的結果
例如當我們搜索“peter smith”,用first_name和last_name peter 是一個很常用的first name 而且 simith也是很常用的last name, 兩週都會有很低的idfs. 但是要是我們有個人他的整個名字是 Smith Willianms? Smith 作爲 first name 是非常不常見的,並且會有很高的 IDF。
一個簡單訪問,peter smith, 因爲 smith在 first_name 這個屬性上有很高的IDF,所以 在first name很高的IDF 會吞沒掉 低的IDF peter as first name 和 smith as last name

Solution

這些問題存在是因爲我們同事處理多個屬性。如果我們將所有的屬性合成到一個屬性裏面,這樣的問題就解決了。例如,在上邊的例子中,我們創建個屬性叫full_name

{
    "first_name":  "Peter",
    "last_name":   "Smith",
    "full_name":   "Peter Smith"
}

當我們僅僅訪問full_name

  1. 匹配更多的單詞會勝過僅僅匹配重複的單詞
  2. minimum_should_match 和operator parameters 可以用了
  3. first name 和 last name 的IDF 會聯合到一起。所以不管smith 是first name 還是 last name 都沒區別的
    當這樣的算法運行的時候,我們不希望存儲冗餘的數據。ElasticSearch 給我們提供了兩個解決方案:
    one at index time
    one at search time
    (這兩個東西啊還不太懂, 之後會講到)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章