尽管我已经看到很多帐户提到这是相对直接的,但我还没有设法看到它正常工作。假设我有这个: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。
我用你的定义(自定义分析,边缘正克过滤器),并产生相同的结果:“对于”什么回报,“福特”返回的一切。根据文件,它应该像你说的那样工作,我只是不明白为什么它不是。你在使用Ruby/Tire吗? – ChuckE 2013-03-12 16:55:04
是的,我正在使用轮胎和红宝石。你是否用耙轮重新索引你的数据:import CLASS ='Car'FORCE = true? – 2013-03-13 09:23:24
我做到了。都使用rake任务并直接在控制台中删除/创建/导入。 – ChuckE 2013-03-13 14:55:00