Sunspot Rails упорядочить результаты поиска по идентификатору модели? - PullRequest
0 голосов
/ 20 июля 2011

Предположим, что у меня есть следующая модель, и я сделал ее доступной для поиска с помощью sunspot_rails.

class Case < ActiveRecord::Base
  searchable do
  end
end

Стандарт schema.xml Sunspot в Rails объявляет id в качестве индексированного поля.Когда я использую веб-интерфейс для доступа к solr и тестовым запросам, запрос вроде:

http://localhost:8982/solr/select/?q=id%3A%22Case+15%22&version=2.2&start=0&rows=10&indent=on

, который ищет Cases с id, равным Case 15, работает нормально и возвращает результаты.

Проблема в том, что когда я выполняю поиск с помощью Sunspot Rails в консоли rails:

s = Case.search do 
    keywords('id:"Case 15"')
end

Я получаю:

=> <Sunspot::Search:{:fl=>"* score", :rows=>10, :start=>0, :q="id:\"Case 15\"", :defType=>"dismax", :fq=>["type:Case"]}>

, которые показывают, что он правильно вставляет :qправильное значение запроса, но число совпадений равно 0:

s.hits

возвращает

=> []

Если мы предположим, что keywords не эквивалентно и выполняет поиск только в поле text (полноетекстовый поиск), а не поле, определенное перед двоеточием :, тогда я могу попробовать следующее:

s = Case.search do
  with(:id, "Case 15")
end

, но это не удается с исключением Sunspot:

Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id'

Какя могу искать, используя индексированное стандартное поле solr / sunspot id моей модели?

И чтобы сделать вопрос более полезным, как я могу сделать заказ по идентификатору.Не работает следующее:

s = Case.search do
  keywords("xxxx")
  order_by :id, :desc
end

не работает.Sunspot::UnrecognizedFieldError: No field configured for Case with name 'id'

1 Ответ

4 голосов
/ 24 августа 2011

Идентификатор, о котором вы говорите, является внутренним полем Sunspot, и его не следует использовать напрямую.

Почему бы не добавить собственное поле идентификатора (измените имя переменной, чтобы избежать конфликта имен):

class Case < ActiveRecord::Base
  searchable do
    integer :model_id {|content| content.id }
  end
end

, а затем

s = Case.search do
  keywords("xxxx")
  order_by :model_id, :desc
end

Другим (грязным) вариантом будет взломать напрямую solr params :

s = Case.search do
  keywords("xxxx")
  adjust_solr_params(:sort, 'id desc')
end
...