Вопрос

У нас есть размещенное приложение, которое управляет страницами контента. Каждая страница может иметь несколько настраиваемых полей и несколько стандартных полей (отметка времени, имя пользователя, адрес электронной почты пользователя и т. Д.).

С потенциально сотнями различных сайтов, использующих систему - каков эффективный способ фильтрации / поиска? Изобразите вид сетки, который вы хотите сузить. Вы можете выполнить фильтрацию по определенным полям (ИД пользователя, дата) или ввести полнотекстовый поиск.

Например, " все страницы, запущенные с использованием идентификатора пользователя 10 " будет довольно быстрый запрос к базе данных MySQL. Но такие вещи, как " все страницы, запускаемые пользователем, чей ID пользователя равен 10 и соответствует [некоторому поисковому запросу] " будет сосать базу данных, поэтому она подходит для поисковой системы, как Lucene.

В основном мне интересно, как другие крупные сайты делают подобные вещи. Используют ли они поисковую систему на 100% для всех типов фильтрации? Они смешивают запросы к базе данных с поисковой системой?

Если мы используем only поисковую систему, возникает проблема с задержкой, необходимой для появления нового / обновленного объекта в поисковом индексе. То есть я читал, что не разумно обновлять индекс немедленно и вместо этого делать это в пакетном режиме. Даже если это означает, что каждые 5 минут пользователи будут сбиты с толку, когда их недавно добавленная страница не будет сразу же отображена в списке при просмотре простого списка страниц (например, поисковый запрос " category: 5 ").

Мы используем MySQL и внимательно следим за поиском в Lucene. Есть ли какая-то другая технология, о которой я не знаю?

Я думаю предложить простую страницу фильтрации, которая использует MySQL для фильтрации по основным полям. Затем предложите отдельную страницу полнотекстового поиска, которая будет представлять результаты, аналогичные Google. Это единственный способ?

Это было полезно?

Решение

Solr или grassyknoll предоставляют немного более абстрактные интерфейсы для Lucene.

Это говорит: да. Если вы, прежде всего, сайт, ориентированный на контент и обеспечивающий полнотекстовый поиск по вашим данным, то есть нечто большее, чем LIKE. Хотя индексы FULLTEXT в MySql не идеальны, тем временем они могут быть приемлемым заполнителем.

Предполагая, что вы создаете индекс Lucene, связать Lucene Documents с вашими реляционными объектами довольно просто, просто добавьте сохраненное свойство к документу во время индекса (это может быть URL, ID, GUID и т. д.) Затем выполните поиск становится двухфазной системой: 1) Выполнить запрос к индексам Lucene (Показать простые результаты, такие как заголовок) 2) Получите более подробную информацию об объекте из ваших реляционных хранилищ по его ключу

Поскольку создание экземпляров Documents в Lucene является относительно дорогостоящим, вы хотите хранить только искомые поля в индексе Lucene, а не полные клоны ваших реляционных объектов.

Другие советы

Не списывайте MySQL с такой готовностью!

Реализуйте это, используя базу данных, например. выборка с «лайком» в предложении where или чем-то еще.

Профилируйте его, добавляйте индексы, если это необходимо. Разверните бета-версию, чтобы получить действительные числа из фактических шаблонов данных пользователя - не все столбцы могут задаваться одинаково после и т. Д.

Если производительность действительно плохая, то тогда, когда вы рассматриваете другие варианты. Вы можете настроить свой SQL, базу данных, компьютер, на котором работает база данных, и, наконец, использовать другой технологический стек ...

Если вы хотите использовать MySQL или PostgreSQL, то решением с открытым исходным кодом, которое прекрасно с ним работает, является Sphinx: http://www.sphinxsearch.com/

У нас такая же проблема, и мы рассматриваем Sphinx и Lucene как возможные решения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top