使用轮胎库进行干扰

时间:2013-05-13 07:54:55

标签: elasticsearch tire

我正在使用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以返回此查询的两个记录(即如何在此处获取词干)?

2 个答案:

答案 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”,它仍会匹配第一个结果 - “一些战斗视频”而不是“战斗视频”匹配。这让我觉得没有正确分析记录。