我正在使用ElasticSearch和Tire执行一些基本的搜索功能,但是snowball词干分析器的基本配置让我摸不着头脑。我基本上遵循了GitHub页面中的代码示例:https://github.com/karmi/tire
这是一个Ruby示例文件(Ruby 1.9.3,Tire 1.8.25):
require 'tire'
Tire.index 'videos' do
delete
create :mappings => {
:video => {
:properties => {
:code => { :type => 'string' },
:description => { :type => 'string', :analyzer => 'snowball' }
}
}
}
end
videos = [
{ :code => '1', :description => "some fight video" },
{ :code => '2', :description => "a fighting video" }
]
Tire.index 'videos' do
import videos
refresh
end
s = Tire.search 'videos' do
query do
string 'description:fight'
end
end
s.results.each do |document|
puts "* #{document.code} - #{document.description}"
end我本以为这会在比赛中产生两个记录,因为格斗和格斗有相同的词干。但是,它只返回第一条记录:
* 1 - some fight video这表明使用的是默认分析器,而不是我正在配置的分析器。
我知道在每个问题(ElasticSearch mapping doesn't work)的查询字符串中传递了实际的字段,并且已经成功地运行了这段代码,因此我的ElasticSearch安装看起来很好。
我需要修改什么才能让Tire返回这个查询的两条记录(例如,我如何在这里进行词干分析)?
发布于 2013-05-21 05:16:18
我本以为这会在比赛中产生两个记录,因为
和fighting有相同的词干。但是,它只返回第一条记录:
正确的。'fight‘的词根是'fight’,返回的结果中只有"fight“。战斗将做完全相同的事情,除非你设置你的搜索索引匹配。
如果你想让它按照你所描述的方式运行,你可能会想让你的默认索引使用一个边缘ngram分析器,这样"fight“也会匹配"fighting”并返回它。这也会有,我认为是理想的效果,如果你也查询“打架”的话,就会同时匹配“打架”和“打架”。
发布于 2013-06-11 15:21:10
好吧,事实证明这是我的一个非常简单的错误。我忽略了在定义视频的散列中包含"type“。替换
videos = [
{ :code => '1', :description => "some fight video" },
{ :code => '2', :description => "a fighting video" }
]使用
videos = [
{ :type => 'video', :code => '1', :description => "some fight video" },
{ :type => 'video', :code => '2', :description => "a fighting video" }
]已修复此问题。
代码更改的结果是将正确的分析器应用于description字段。以前,雪球分析器将仅应用于搜索查询,这将导致搜索查询被词干处理。如果我在查询语句中输入"description: fighting“,它仍然会匹配第一个结果--”一些格斗视频“,而不是”一个格斗视频“。这让我意识到这些记录没有被正确分析。
https://stackoverflow.com/questions/16517210
复制相似问题