2013-06-24 3 views
0

Я строю свое первое приложение Rails и отлично работаю с Thinking Sphinx. Я понять большинство из них, но хотелось бы, если бы кто-то может помочь мне прояснить несколько концептуальных вопросыМышление Sphinx & Rails вопросы

  1. При отображении результатов поиска после запроса сфинкса, я должен использовать в sphinx_attributes, возвращаемые из запроса сфинкса ? Или должен ли мой взгляд использовать обычные объекты рельсов, такие как @ property.title, @ property.amvents.title и т. Д.? Если я использую обычные объекты рельсов, разве это не означает, что он делает дополнительные запросы?

  2. В форуме я бы хотел показать «непрочитанные сообщения». Очевидно, что это истинно/ложно для каждой комбинации пользователей/тем, поэтому я думаю, что я должен кэшировать идентификаторы читателя в индексе sphinx в этой теме. Таким образом, я могу быстро выполнить запрос для всех непрочитанных сообщений для данного user_id. У меня это работает, но потом понял, что это бессмысленно, так как есть временная задержка между индексами sphinx. Поэтому, если пользователь нажимает на непрочитанное сообщение, он все равно будет отображаться непрочитанным до тех пор, пока база данных sphinx не будет проиндексирована.

  3. Я все еще на разработке, поэтому я вручную индексирую/перестраиваю, но на производстве, что такое стандартное время между повторной индексацией?

  4. У меня есть модель с несколькими текстовыми полями. Должен ли я объединить эти все в один столбец в индексе sphinx для поиска по ключевым словам? Конечно, это быстрее, чем индексирование всех отдельных полей.

  5. Немного не по теме, но просто интересно - когда вы получаете доступ к вложенным моделям, например @ property.agents.name, влияет ли это на производительность? Или рельсы автоматически извлекают все связанные записи, когда свойство вытаскивается из базы данных?

ответ

1

Чтобы ответить на каждый из ваших пунктов:

  1. Для обоих ваших примерах sphinx_attributes не было бы полезно. Во-первых, вы уже загрузили свойство, поэтому заголовок доступен напрямую без дополнительного попадания в базу данных. А для property.amenities.title вы имеете дело с массивом строк, который у Сфинкса нет. Как правило, я использовал бы только sphinx_attributes для сложных вычисляемых атрибутов, а не для стандартных ссылок столбцов.

  2. Да, вы правы, это будет задержка с этим значением.

  3. Это зависит от того, как часто изменяются ваши данные. У меня есть некоторые приложения, где я могу индексировать каждый день, потому что изменения настолько редки, но другие, где мы будем запускать его каждые 10 минут. Если данные особенно неустойчивы, я рассмотрю использование дельта (обычно через Sidekiq), чтобы в течение нескольких секунд произошли изменения в Sphinx.

  4. Я не думаю, что это имеет большое значение в любом случае - если вы не хотите искать по любой из этих столбцов отдельно? Если это так, это должно быть отдельное поле.

  5. По умолчанию при использовании агентов каждого свойства агенты для этого свойства будут загружены из базы данных (один вызов SQL на каждое свойство). Вы можете посмотреть на the eager loading docs, как управлять этим лучше, когда вы имеете дело с несколькими записями. Мышление Sphinx has the ability должно пройти через :include варианты основного вызова ActiveRecord.

+0

Большое спасибо за подробный ответ!Я не могу отметить это как правильно, так как у меня нет репутации, но жаль, но я очень ценю это! Re номер 2, есть ли лучший способ сделать это? Разумеется, это довольно распространенная функция, я бы хотел сделать то же самое для свойства «список наблюдения», но его вряд ли полезно, если пользователь должен ждать 10 минут, чтобы увидеть свойство в своем списке наблюдения. – Dave

+0

Возможно, стоит прочитать дельта, поскольку это может уменьшить отставание до нескольких секунд. – pat