2013-03-12 48 views
1

儘管我已經看到很多帳戶提到這是相對直接的,但我還沒有設法看到它正常工作。假設我有這個:ElasticSearch/Tire:如何正確設置部分單詞搜索

class Car < ActiveRecord::Base 
    settings analysis: { 
    filter: { 
     ngram_filter: { type: "nGram", min_gram: 3, max_gram: 12 } 
    }, 
    analyzer: { 
     partial_analyzer: { 
     type: "snowball", 
     tokenizer: "standard", 
     filter: ["standard", "lowercase", "ngram_filter"] 
     } 
    } 
    } do 
    mapping do 
     indexes :name,     index_analyzer: "partial_analyzer" 
    end 
    end 
end 

假設我有一輛名爲「Ford」的汽車,我更新了我的索引。現在,如果我搜索「福特」:

Car.tire.search { query { string "Ford" } } 

我的車在我的結果中。現在,如果我查找「For」:

Car.tire.search { query { string "For" } } 

我的車已找不到了。我認爲nGram過濾器會自動爲我處理,但顯然不是。作爲臨時解決方案,我使用通配符(*)進行此類搜索,但這絕對不是最好的方法,因爲我的搜索中是min_gram和max_gram定義的關鍵元素。誰能告訴我他們是如何解決這個問題的?

我使用Rails 3.2.12與紅寶石1.9.3。 ElasticSearch版本爲0.20.5。

回答

5

你想使用自定義的分析,而不是一個滾雪球的:Elasticsearch custom analyzer

基本上其他分析儀配備了一組預定義的過濾器和斷詞。

你可能也想使用邊NGRAM過濾器:Edge-Ngram filter

邊NGRAM和NG​​RAM之間的差別基本上是邊NGRAM基本上只堅持了一個學期的「邊緣」。所以它從前面或後面開始。福特 - > [供]代替 - > [供,ORD]

上自動完成的課題一些更高級的鏈接:

Autocompletion with fuzziness (pure elasticsearch, no tire, but very good read)

Another useful question with links provided

編輯

基本上我有一個非常類似的設置,你有什麼。但是用另一個標題和多字段的分析器。由於多語言支持,這裏有一個名稱數組,而不是一個名稱。

我還指定了search_analyzer,我使用了字符串鍵而不是符號。這是我實際上有:

settings "analysis" => { 
    "filter" => { 
     "name_ngrams" => { 
      "side"  => "front", 
      "max_gram" => 20, 
      "min_gram" => 2, 
      "type"  => "edgeNGram" 
     } 
    }, 
    "analyzer" => { 
     "full_name"  => { 
      "filter" => %w(standard lowercase asciifolding), 
      "type"  => "custom", 
      "tokenizer" => "letter" 
     }, 
     "partial_name"  => { 
      "filter" => %w(standard lowercase asciifolding name_ngrams), 
      "type"  => "custom", 
      "tokenizer" => "standard" 
     } 
    } 
} do 
    mapping do 
    indexes :names do 
     mapping do 
     indexes :name, :type => 'multi_field', 
       :fields => { 
        "partial"   => { 
         "search_analyzer" => "full_name", 
         "index_analyzer" => "partial_name", 
         "type"   => "string" 
        }, 
        "title"  => { 
         "type"  => "string", 
         "analyzer" => "full_name" 
        } 
       } 
     end 
    end 
    end 
end 
+0

我用你的定義(自定義分析,邊緣正克過濾器),併產生相同的結果:「對於」什麼回報,「福特」返回的一切。根據文件,它應該像你說的那樣工作,我只是不明白爲什麼它不是。你在使用Ruby/Tire嗎? – ChuckE 2013-03-12 16:55:04

+0

是的,我正在使用輪胎和紅寶石。你是否用耙輪重新索引你的數據:import CLASS ='Car'FORCE = true? – 2013-03-13 09:23:24

+0

我做到了。都使用rake任務並直接在控制檯中刪除/創建/導入。 – ChuckE 2013-03-13 14:55:00