尽管我看到很多关于它的说法都提到这一点相对简单,但我还没有看到它正常工作。假设我有这个:
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。