Эффективная фильтрация / поиск - PullRequest
5 голосов
/ 19 ноября 2008

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

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 19 ноября 2008

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

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

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

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

0 голосов
/ 12 июня 2009

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

У нас та же проблема, и мы рассматриваем Сфинкса и Люцена как возможные решения.

0 голосов
/ 19 ноября 2008

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

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

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

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

...