Chu*_*ckE 1 ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
让我们说我有一辆名为"福特"的汽车,我更新了我的索引.现在,如果我搜索"福特":
Car.tire.search { query { string "Ford" } }
Run Code Online (Sandbox Code Playgroud)
我的车在我的结果中.现在,如果我寻找"For":
Car.tire.search { query { string "For" } }
Run Code Online (Sandbox Code Playgroud)
我的车再也找不到了.我认为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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3393 次 |
| 最近记录: |