1

我正在使用 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 映射不起作用)并且已成功运行此代码,因此我的 ElasticSearch 安装看起来不错。

我需要更改什么让轮胎返回此查询的两条记录(即如何让词干在这里工作)?

4

2 回答 2

0

我本来希望这会在比赛中产生这两个记录,因为战斗和战斗具有相同的主干。但是,它只返回第一条记录:

正确的。'fight' 源于 'fight' 并返回只有“fight”的结果。战斗将做完全相同的事情,除非您将搜索索引设置为以其他方式匹配。

如果您希望它按照您描述的方式运行,您可能希望让您的默认索引使用边缘 ngram 分析器,以便“战斗”也将匹配“战斗”并返回它。如果您也查询“战斗”,我认为这也将具有匹配“战斗”和“战斗”的理想效果。

于 2013-05-20T21:16:17.557 回答
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”,它仍然会匹配第一个结果——“some fight video”而不是“a fucking video”匹配。这让我知道没有正确分析记录。

于 2013-06-11T07:21:09.887 回答