我正在使用ElasticSearch和Tire执行一些基本的搜索功能,但是雪球阻塞分析器的基本配置让我感到难过。我几乎遵循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以返回此查询的两个记录(即如何在此处获取词干)?
答案 0 :(得分:0)
我原本预计这会在比赛中产生两个记录,因为战斗和战斗具有相同的干。但是,它只返回第一条记录:
右。 '斗争'源于'战斗'并返回结果只有“战斗”。除非您将搜索索引设置为匹配,否则战斗将完全相同。
如果你希望它按照你描述的方式运行,你可能想让你的默认索引使用边缘ngram分析器,这样“战斗”也会匹配“战斗”并返回它。如果你也在查询“战斗”,那么我认为这也是“战斗”和“战斗”相匹配的理想效果。
答案 1 :(得分:0)
嗯,事实证明这对我来说是一个非常简单的错误。我忽略了在定义视频的哈希中包含“类型”。替换
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:fighting”,它仍会匹配第一个结果 - “一些战斗视频”而不是“战斗视频”匹配。这让我觉得没有正确分析记录。