4

キーワードがフィールドに表示される回数に基づいて結果を返すように、ElasticSearch (具体的には Tire gem) が必要です。たとえば、Article というモデルのフィールドタイトルにインデックスを付けます。最初のオブジェクトのタイトル値は'Funny Funny subject'で、2 番目のオブジェクトのタイトル値は'Funny subject'です。キーワード'Funny'を検索すると、タイトルに 2 つの 'Funny' 単語が含まれているため、最初のオブジェクトが最初に返されるようにインデックスを作成したいと考えています。タイヤ経由でこれを行うことは可能ですか?索引付け方法も何と呼ばれますか?

4

1 に答える 1

2

ここでの作業サンプルです。ここでの重要な要素は、十分に高くなければならないブースト値であり、クエリでワイルドチャートを使用することはできません。

require 'tire'
require 'yajl/json_gem'

articles = [
  { :id => '0', :type => 'article', :title => 'nothing funny'},
  { :id => '1', :type => 'article', :title => 'funny'},
  { :id => '2', :type => 'article', :title => 'funny funny funny'}
]

Tire.index 'articles' do
  import articles
end

Tire.index 'articles' do
  delete

  create :mappings => {
    :article => {
      :properties => {
        :id       => { :type => 'string', :index => 'not_analyzed', :include_in_all => false },
        :title    => { :type => 'string', :boost => 50.0,            :analyzer => 'snowball'  },
        :tags     => { :type => 'string', :analyzer => 'keyword'                             },
        :content  => { :type => 'string', :analyzer => 'snowball'                            }
      }
    }
  }

  import articles do |documents|
    documents.map { |document| document.update(:title => document[:title].downcase) }
  end

  refresh
end

s = Tire.search('articles') do
  query do
    string "title:funny"
  end
end

s.results.each do |document|
  puts "* id:#{ document.id } #{ document.title } score: #{document._score}"
end

与える

* id:2 funny funny funny score: 14.881571
* id:1 funny score: 14.728935
* id:0 nothing funny score: 9.81929
于 2012-08-30T13:42:47.090 に答える