2013-05-13 59 views
1

我正在使用ElasticSearch和Tire執行一些基本的搜索功能,但是雪球干擾分析器的基本配置讓我難住了。我幾乎從以下GitHub的頁面代碼示例:https://github.com/karmi/tire使用輪胎庫進行干擾

下面是一個Ruby示例文件(紅寶石1.9.3,輪胎25年8月1日):

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安裝看起來很好。

我需要做什麼來改變輪胎的這個查詢(即我如何才能制止在這裏工作)返回兩個記錄?

回答

0

我原以爲這樣會在比賽中產生兩個記錄,因爲戰鬥和戰鬥有相同的主幹。然而,它只返回的第一條記錄:

權。 '戰鬥'阻止'戰鬥',並返回只有「戰鬥」的結果。戰鬥將做同樣的事情,除非你設置你的搜索索引,否則匹配。

如果你想讓它表現你所描述的方式,你可能想使你的默認索引使用邊緣NGRAM分析儀,使「拼」也將匹配「打架」,並將其返回。如果您也查詢「戰鬥」,這也將具有我認爲可取的效果,即匹配「戰鬥」和「戰鬥」。

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" } 
] 

解決了這一問題。

代碼更改的影響是將正確的分析器應用於描述字段。以前,雪球分析器只能應用於導致搜索查詢被阻止的搜索查詢。如果我在查詢語句中輸入「描述:戰鬥」,它仍然會匹配第一個結果 - 「有些戰鬥視頻」,而不是「戰鬥視頻」匹配。這讓我意識到記錄沒有被正確分析。