[英]ElasticSearch/Tire: How to properly set partial word searches up
即使我已經看到很多關於它的描述都相對簡單,但我還是沒有設法使其正常運行。 假設我有這個:
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
假設我有一輛名為“福特”的汽車,並且更新了索引。 現在,如果我搜索“福特”:
Car.tire.search { query { string "Ford" } }
我的車在我的成績中。 現在,如果我尋找“ For”:
Car.tire.search { query { string "For" } }
找不到我的車了。 我以為nGram過濾器會自動為我處理它,但顯然不是。 作為一種臨時解決方案,我使用通配符(*)進行此類搜索,但這絕對不是最好的方法,因為min_gram和max_gram定義是搜索中的關鍵元素。 誰能告訴我他們是如何解決的?
我正在使用Rails 3.2.12和ruby 1.9.3。 ElasticSearch版本為0.20.5。
您想要使用定制分析器而不是雪球之一: Elasticsearch定制分析器
基本上,其他分析器都帶有一組預定義的過濾器和標記器。
您可能還想使用Edge-Ngram過濾器: Edge-Ngram過濾器
Edge-NGram和NGram之間的區別基本上是Edge-Ngram,基本上僅堅持術語的“邊緣”。 因此,它從前面或后面開始。 福特-> [For]代替-> [For,ord]
有關自動完成的一些更高級的鏈接:
自動補全,帶有模糊性(純彈性搜索,無疲勞感,但讀取效果非常好)
編輯
基本上,我的設置與您的設置非常相似。 但是還有一個標題和多字段分析器。 由於具有多語言支持,因此這里是一個名稱數組,而不僅僅是一個名稱。
我還指定了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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.