Вложенный поиск в solr

У меня есть модель Activity и модель ActivityOccurrence, где Activity has_many :activity_occurrences

Activity: Эта модель будет иметь все метаданные, необходимые для ActivityOccurrence.

AcitvityOccurrence: attrs - вхождение (дата-время), завершено.

Теперь у нас есть новое требование, согласно которому мы должны показывать все случаи активности в результатах поиска, когда пользователь ищет действия в определенном диапазоне.

Раньше мы показывали только одну запись в случае повторяющихся действий.

Поэтому в соответствии с новым требованием мы решили переместить поиск с Activity на ActivityOccurrence.

Теперь я не хочу индексировать метаинформацию Activity в каждом моем ActivityOccurrence, поскольку моя активность имеет на 10 полей больше, чем ActivityOccurrence,

например: если у меня есть Activity с 1000 AcitivityOccurrence, тогда я буду индексировать всю информацию о своей деятельности в 1000 AcitivityOccurrence записей.

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

Следовательно, меня больше всего беспокоит объем индексации, которую я должен выполнить.

Поэтому я думаю избегать индексов активности в ActivityOccurrence.

Итак, есть ли способ сначала искать Activity на основе его фильтров, а затем искать ActivityOccurrence в диапазоне на основе результатов действий?

Примечание. Также у нас есть бесконечные вхождения.

Любые идеи?

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


person Abibullah Rahamathulah    schedule 27.03.2014    source источник


Ответы (1)


Если вы не имеете дело с миллионами действий/происшествий, это может быть преждевременной оптимизацией - пространство дешево, а SOLR работает быстро. Глядя на это с другой стороны, рассматривали ли вы просто индексирование списка вхождений действий, относящихся к каждому действию (используя обратные вызовы для обеспечения его обновления)? Трудно действительно оптимизировать без дополнительной информации о ваших шаблонах доступа к данным, но Я никогда не был сторонником делать больше круговых поездок, чем необходимо.

Тем не менее, хотя я не уверен, как написать чистый SOLR-запрос для этого, вы можете сделать это с помощью Sunspot довольно легко:

Убедитесь, что ActivityOccurence доступен для поиска с помощью Activity (т. е. по идентификатору действия).

Найдите Activity нужные метаданные и используйте их для извлечения релевантных идентификаторов:

search = Activity.solr_search {<some block that does what you want>}
activity_ids = search.hits.map { |hit| hit.primary_key.to_i }

Теперь вы можете просто добавить параметр with в свой блок поиска ActivityOccurence:

with(:activity_id, activity_ids)

Это ограничит поиск вхождениями для этих действий. Обратите внимание, что при этом вы жертвуете производительностью времени поиска ради эффективности индекса.

person mikeryz    schedule 11.04.2014