Оценка ElasticSearch (жемчужина шин)

Я хочу, чтобы ElasticSearch (точнее, камень Tire) возвращал результат в зависимости от того, сколько раз ключевое слово появляется в полях. Например, я индексирую поле title в модели с именем Article. У меня есть два объекта, первый объект имеет значение title 'Забавная забавная тема', а второй объект имеет значение заголовка 'Смешная тема' . Я хочу индексировать таким образом, чтобы при поиске по ключевому слову "Смешной" первым возвращался первый объект, так как в его заголовке есть два слова "Смешной". Можно ли это сделать через шину? Как называется метод индексации?


person RubyFanatic    schedule 30.08.2012    source источник


Ответы (1)


Здесь рабочий образец, ключевым фактором здесь является значение повышения, которое должно быть достаточно высоким, и вы не можете использовать подстановочные диаграммы в запросе.

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
person peter    schedule 30.08.2012
comment
Не могли бы вы рассказать немного подробнее, как бы вы достигли этой цели? Увеличение поля заголовка? - person javanna; 30.08.2012
comment
см. elasticsearch.org/guide/reference/mapping/boost-field.html для значения повышения, в основном оно определяет результирующий балл по сравнению с результатом других полей/тегов и т. д., чем выше число попаданий * уровень повышения, тем больше вероятность того, что это попадание поднимется в рейтинге индекса - person peter; 30.08.2012
comment
К сожалению, это не работает для меня, Питер. Я добавил высокое значение для поля, похожего на заголовок, но оно не сортируется правильно, как предполагалось. - person RubyFanatic; 30.08.2012
comment
Вы можете опубликовать свои данные, чтобы мы могли проверить? - person peter; 31.08.2012