2013-08-28 48 views
2

在SQL中,我可以使用SQL LIKE很好地搜索電子郵件地址。如何設置ElasticSearch來爲電子郵件地址執行SQL LIKE「%」?

通過電子郵件「[email protected]」,搜索「堆棧」,「@ domain.com」,「domain.com」或「域名」將使我回到期望的電子郵件地址。

我怎樣才能得到與ElasticSearch相同的結果?

我玩過nGram,edgeNGram,uax_url_email等,搜索結果一直很糟糕。請糾正我,如果我錯了,這聽起來像我必須做到以下幾點:

  1. 爲index_analyzer
    • 使用「關鍵字」,「空格」或「uax_url_email」標記者這樣的電子郵件唐「噸得到標記化
      • 但通配符查詢似乎不工作(與輪胎至少)
    • 使用‘NGRAM’或‘edgeNGram’爲過濾
      • 我總是會遇到太多不需要的結果,例如搜索「第一秒」時獲取「[email protected]」。
  2. 爲search_analyzer
    • 不做NGRAM

一個實驗代碼

tire.settings :number_of_shards => 1, 
      :number_of_replicas => 1, 
      :analysis => { 
       :filter => { 
        :db_ngram => { 
         "type"  => "nGram", 
         "max_gram" => 255, 
         "min_gram" => 3 } 
       }, 
       :analyzer => { 
        :string_analyzer => { 
         "tokenizer" => "standard", 
         "filter"  => ["standard", "lowercase", "asciifolding", "db_ngram"], 
         "type"   => "custom" }, 
        :index_name_analyzer => { 
         "tokenizer" => "standard", 
         "filter"  => ["standard", "lowercase", "asciifolding"], 
         "type"   => "custom" }, 
        :search_name_analyzer => { 
         "tokenizer" => "whitespace", 
         "filter"  => ["lowercase", "db_ngram"], 
         "type"   => "custom" }, 
        :index_email_analyzer => { 
         "tokenizer" => "whitespace", 
         "filter"  => ["lowercase"], 
         "type"   => "custom" } 
       } 
      } do 
    mapping do 
     indexes :id,   :index => :not_analyzed 
     indexes :name,   :index_analyzer => 'index_name_analyzer', :search_analyzer => 'search_name_analyzer' 
     indexes :email,  :index_analyzer => 'index_email_analyzer', :search_analyzer => 'search_email_analyzer' 
    end 
end 

具體情況不很好地工作:

  • 帶連字符的電子郵件(例如, [email protected]
  • 查詢字符串「@」開頭或結尾
  • 精確匹配
  • 與像「@」變得非常意外的結果通配符搜索。

想是的。 「[email protected]」, 「[email protected]」 和 「[email protected],搜索 」AAA「 給我 」[email protected]「」 [email protected]。搜索「aaa *」給我所有的東西,但「aaa- *」沒有給我什麼。那麼,我應該怎麼做完全匹配通配符查詢?對於這些類型的查詢,對於不同的標記器/分析器,我得到的結果幾乎相同。 Model.tire.index.delete Model.tire.create_elasticsearch_index Model.tire.index.import型號:

我每次映射改變後做這些。所有

參考文獻:

+0

相似的問題:https://stackoverflow.com/questions/44791075/in-elasticsearch-how-do-i-search-for-an-arbitrary-substring –

回答

0

考慮到你所要完成什麼,KeywordAnalyzer可能是分析的一個合理的選擇,但我沒有看到任何會導致問題與WhitespaceAnalyzer

我懷疑你遇到了查詢解析和分析問題,雖然你沒有真正描述你是如何查詢的。最簡單的情況是簡單地使用termprefix查詢。

它似乎有點像StandardAnalyzer將成爲你的目的,在這裏,主要是(「aaa_0」和「AAA-0」之間的區別將是一個問題),只要它是一貫適用,且查詢是正確的。

+0

謝謝。實際上,查詢很簡單,只有一個字符串/術語。 Model.tire.search(:負載=>真實,:per_page => 25)做 查詢{字符串 「* COM」} 結束 我試過前綴,我想 「@ .gmail.com」 不會工作。我無法弄清楚如何使用輪胎寶石做通配符查詢,否則我會用精確的查詢鏈和通配符查詢以不同的方式搜索電子郵件。 布爾:minimum_number_should_match => 1做 應該{前綴 '電子郵件',術語} 應該{前綴 'email.exact',術語} 應該{串術語} 端 –

相關問題