Порядок поиска Sunspot - PullRequest
       9

Порядок поиска Sunspot

0 голосов
/ 31 января 2012

Я использую Sunspot (https://github.com/sunspot/sunspot) с Rails.

Вот моя модель:

class Item < ActiveRecord::Base
  searchable do
    boolean :red
    boolean :blue
    boolean :green
    ...
  end
end

Рассмотрим следующий поиск:

Item.search
  any_of do
    with :red, true
    with :blue, true
    with :green, true
  end
end

Как можноЯ упорядочиваю результаты следующим образом: элементы, содержащие все цвета, за которыми следуют элементы, содержащие 2 цвета, а затем элементы, содержащие 1 из цветов?

Примечание : это всего лишь один пример поискаОтвет должен учитывать все возможные комбинации поиска для цветов.

Обновление 1

Упорядочение по количеству цветов не будет работать. Например, скажем, у вас естьэлементы:

  1. зеленый / синий
  2. зеленый / красный / черный

Если вы ищете зеленый и синий, пункт 2 будет стоять перед элементом 1.

Ответы [ 2 ]

0 голосов
/ 31 января 2012

О!Я не думал, что там, где другие цвета в игре ... Спасибо за обновление.В этом случае другим вариантом будет свернуть все цветовые коды (имена) объекта в одном поле text в доступном для поиска блоке, а затем запустить полнотекстовый поиск по этому полю, используя все необходимые цвета какключевое слово.Объект, который получит больше совпадений, получит наивысшую оценку релевантности и будет возвращен первым.Что-то вроде:

class Item < ActiveRecord::Base
  searchable do
    text :color_codes, :stored => true
  end

  # will return "green blue " for item1 above
  # will return "green red black " for item2 above
  def color_codes
    # implementation may vary
    colors=""
    self.attributes.each do |k,v|
      if %w(red blue green black ...).include?(k.to_s) && v?
        colors += "#{k} "
      end
    end
    colors
  end
end

Тогда ваша подпрограмма поиска будет выглядеть так:

q = "green blue"
Item.search do
  keywords q do
    fields :color_codes
  end
end

элемент1 выше будет иметь точное совпадение при поиске по "зеленому синему" и появится первым

0 голосов
/ 31 января 2012

Безобразно, но, вероятно, добьется цели:

class Item < ActiveRecord::Base
  searchable do
    boolean :red
    boolean :blue
    boolean :green
    integer :number_of_colors, :stored => true
  end

  def number_of_colors
    # implementation may vary
    count=0
    self.attributes.each do |k,v|
      if %w(red blue green).include?(k.to_s) && v?
        count += 1
      end
    end
    count
  end
end

Затем, после переиндексации:

Item.search
  any_of do
    with :red, true
    with :blue, true
    with :green, true
    order_by :number_of_colors, :desc
  end
end

Надеюсь, это поможет.

...