Отображение rails относится к elacticsearch для поиска по вложенным объектам и разбивки на страницы

В моем проекте рельсов у меня есть две модели:

class Student < ActiveRecord::Base
  attr_accessible :name
  has_many :homeworks   
  ...
end

class Homework < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  attr_accessible :grade
  belongs_to :student
  ...
end

Я хочу выполнить запрос на стороне эластичного поиска:

  1. Найдите всех учащихся с хотя бы одной оценкой "F" за домашнее задание.
  2. Sort students
    • by count of homeworks rated 'F'
    • по имени
  3. Пагинация студентов

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

Я пробовал следующие подходы:

  1. Сохранение атрибутов родительского объекта внутри дочерних объектов и использование фасетов для группировки. Кажется, это работает, но тогда я не могу разбить свои результаты на страницы, как описано здесь: http://bit.ly/10hyYoS
  2. Использование вложенных документов. Мой поисковый запрос возвращает отфильтрованных студентов со всеми неотфильтрованными домашними заданиями, и я не уверен, как отфильтровать детей в результатах поиска.

Я был бы признателен за совет о том, как сопоставить эти модели с elasticsearch и эффективно выполнять запросы.

Не требуется полного решения, просто общее представление о направлении. Стоит ли использовать вложенные объекты? Хранить атрибуты ученика внутри домашнего задания и использовать фасеты для группировки?

Заранее спасибо!


person Peter Yeremenko    schedule 25.06.2013    source источник


Ответы (1)


В аналогичном случае использования я использовал сопоставление _parent, так что домашнее задание имеет атрибут сопоставления для:

"_parent": "student"

Затем я делаю обычный запрос:

"query":{ 
  "filtered":{
    "filter": {
     "and": [{
       "term": {"_type": "student"},    
       "has_child": {
          "query":{
             "filtered":{
               "filter":{
                 "term":{"grade", "value"}
              ...

(это не проверено, кроме аналогичного запроса для другого проекта)

Отфильтрованный запрос has_child является важной частью, поскольку он позволяет вам искать студентов, у которых есть домашнее задание с оценкой F, и включать их в свой фасет.

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

person Phil    schedule 25.06.2013
comment
Фил, спасибо за ответ. Разобрался, как сортировать по количеству, не хватает только нумерации страниц. Любые указания по этому поводу были бы очень полезны! - person Peter Yeremenko; 27.06.2013
comment
Питер, я предполагаю, что проблема разбивки на страницы не так проста, как использование from / size, описанного здесь: elasticsearch.org/guide/reference/api/search/from-size ... хотя я не пробовал, я предполагаю, что это не помогает уменьшить аспект. Если нет, я бы посмотрел на возможную разбивку на страницы по начальной букве имени или какой-либо другой форме, которая помогает интуитивно ограничить набор результатов на основе вашего приложения. - person Phil; 27.06.2013