2016-08-24 90 views
3

我是新來的彈性搜索,所以我掙扎了一下,爲我們的數據找到最佳查詢。彈性搜索查詢同時使用match_phrase_prefix和模糊性?

想象一下,我想匹配下列單詞「Handelsstandens Boldklub」。

目前,我使用下面的查詢:

{ 
    query: { 
     bool: { 
     should: [ 
      { 
      match: { 
       name: { 
       query: query, slop: 5, type: "phrase_prefix" 
       } 
      } 
      }, 
      { 
      match: { 
       name: { 
       query: query, 
       fuzziness: "AUTO", 
       operator: "and" 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 

目前,它列出如果我搜索「手」這個詞,但如果我搜索「處理」一詞將不再上市因爲我做了一個錯字。但是,如果我以「Handlesstandens」結尾,它會再次列出,因爲模糊會碰到輸入錯誤,但只有當我輸入整個單詞時。

它是否有可能在同一時間做phrase_prefix和模糊?那麼在上面的例子中,如果我在路上犯了一個錯字,它還會列出這個單詞嗎?

所以在這種情況下,如果我搜索「句柄」,它仍然會匹配單詞「Handelsstandens Boldklub」。

還有什麼其他解決方法可以實現上述體驗?我喜歡phrase_prefix匹配,因爲它也支持馬虎匹配(因此我可以搜索「Boldklub漢」,它會列出結果)

或者可以通過使用完成建議程序來實現上述目標嗎?

回答

0

好,所以在進一步研究elasticsearch之後,我得出了應該使用ngrams的結論。

這是一個非常好的解釋它的功能和工作原理。 https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch

這裏是我使用的設置和映射:(這是elasticsearch護欄語法)

settings analysis: { 
    filter: { 
    ngram_filter: { 
     type: "ngram", 
     min_gram: "2", 
     max_gram: "20" 
    } 
    }, 
    analyzer: { 
    ngram_analyzer: { 
     type: "custom", 
     tokenizer: "standard", 
     filter: ["lowercase", "ngram_filter"] 
    } 
    } 
} do 
    mappings do 
    indexes :name, type: "string", analyzer: "ngram_analyzer" 
    indexes :country_id, type: "integer" 
    end 
end 

和查詢:(該查詢實際上是在兩個不同的指標在同一時間搜索)

{ 
    query: { 
     bool: { 
     should: [ 
      { 
      bool: { 
       must: [ 
       { match: { "club.country_id": country.id } }, 
       { match: { name: query } } 
       ] 
      } 
      }, 
      { 
      bool: { 
       must: [ 
       { match: { country_id: country.id } }, 
       { match: { name: query } } 
       ] 
      } 
      } 
     ], 
     minimum_should_match: 1 
     } 
    } 
    } 

但基本上你應該只是做一個匹配或多匹配查詢,這取決於你想要多少字段進行搜索。

我希望有人發現它有幫助,因爲我個人在模糊性而不是ngram方面想的很多(之前不知道)。這導致我走錯了方向。