Lucene поиск по различным объектным моделям - PullRequest
2 голосов
/ 05 декабря 2011

Я думаю об использовании Lucene для обеспечения поиска по сайту.

Веб-сайт включает в себя несколько различных объектных моделей (например, форум, опрос и т. Д.), И я хотел бы иметь возможность разрешать поиск по различным объектным моделям (например, поиск по форумам и | или опросам)

У меня есть два (несколько связанных) вопроса:

  1. Должны ли объекты обеспечивать согласованность (т. Е. Тот же интерфейс с Lucene)? - например, должны ли все объекты быть индексами иметь свойства id, title, content и т. д., или каждый объект может хранить различные поля данных?

  2. Какой синтаксис потребуется пользователю для поиска (только опросы или опросы и форумы [в качестве примеров]) определенного ключевого слова?

Я использую PHP-порт Lucene.

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

У вас есть 2 варианта.

  1. Создание отдельного индекса для каждого типа документа (форум, опрос и т. Д.). Преимущество, более простые запросы, более простые документы, более точные соответствия (нормализация вашего поля не зависит от других данных документа). Недостаток, необходимость вести отдельные индексы, иметь разрозненные документы.

  2. Создание единого индекса. Документ, который вы храните, будет объединением всех полей всех объектов, которые вы хотите запросить. Вы добавляете дополнительное поле типа (форум, опрос и т. Д.), Которое вы храните. Затем при запросе вы фильтруете по типу, чтобы получить только те результаты, которые вы хотите. Преимущество, единый документ / индекс для поддержки. Недостатком является то, что вы можете получить перекрестные помехи в общих полях, которые могут исказить результаты поиска.

Чтобы уточнить недостатки, я упоминаю в 2 выше. В Lucene присуще взвешивание по отношению к «более редким» терминам. Если у вас есть запрос, который использует редкий термин, и этот термин появляется только в нескольких документах, этот документ будет пузыриться в верхней части результатов поиска. Если вы разделяете поле между двумя различными документами в объединении, может (не всегда) быть в тех случаях, когда результаты поиска взвешиваются иначе, чем должны, и это очевидно для конечного пользователя.

Я бы склонялся к варианту 1 для правильности, 2 для простоты обслуживания. Это компромисс.

РЕДАКТИРОВАТЬ: если вы хотите поддерживать запросы для нескольких типов в одном запросе, вариант 2 предпочтительнее. Только так вы сможете комбинировать результаты из разных типов документов. Запрашивать 2 индекса и пытаться каким-то образом упорядочить результаты практически невозможно из-за алгоритмов оценки.

0 голосов
/ 05 декабря 2011

Lucene использует понятие «документы», которые являются записями в индексе Lucene.Каждый документ имеет несколько «полей», которые содержат фактические данные.Вы сможете искать все, что добавляете в индекс Lucene, но важно, чтобы эти записи создавались с идентификатором, который позволяет сопоставить результат запроса с экземпляром вашей модели.

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

Что касается синтаксиса, Lucene предоставляет очень хороший синтаксис запросов, подобный Google.То, как вы будете создавать свои документы / индексные записи Lucene, будет определять, как выражаются ваши запросы.

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