Lucene сложная структура поиска - PullRequest
1 голос
/ 29 апреля 2010

В основном у меня есть довольно простая база данных, которую я хотел бы проиндексировать с помощью Lucene. Домены:

// Person domain
class Person {
  Set<Pair> keys;
}

// Pair domain
class Pair {
  KeyItem keyItem;
  String value;
}

// KeyItem domain, name is unique field within the DB (!!)
class KeyItem{
  String name;
}

У меня десятки миллионов профилей и сотни миллионов пар, однако, поскольку большинство полей "name" в KeyItem дублируются, существует всего несколько десятков экземпляров KeyItem. Пришел к этой структуре, чтобы сохранить на экземплярах KeyItem.

В принципе любой профиль с любыми полями может быть сохранен в этой структуре. Допустим, у нас есть профиль со свойствами

- name: Andrew Morton
- eduction:  University of New South Wales, 
- country: Australia, 
- occupation: Linux programmer.

Для его хранения у нас будет один экземпляр Profile, 4 экземпляра KeyItem: имя, образование, страна и род занятий, и 4 экземпляра Pair со значениями: «Эндрю Мортон», «Университет Нового Южного Уэльса», «Австралия» и "Linux Programmer".

Все остальные профили будут ссылаться (все или некоторые) на одни и те же экземпляры KeyItem: имя, образование, страна и род деятельности.

Мой вопрос заключается в том, как проиндексировать все это, чтобы я мог искать в Профиле некоторые конкретные значения KeyItem :: name и Pair :: value. В идеале я бы хотел, чтобы такой запрос работал:

имя: Андрей * И род занятий: Linux *

Должен ли я создать собственный индексатор и поисковик? Или я мог бы использовать стандартные и просто сопоставить KeyItem и Pair как компоненты Lucene?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2010

Полагаю, вы можете использовать стандартную методологию Lucene. Я бы:

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

Если вы выберете голую Lucene, вам понадобятся пользовательские Indexer и Searcher, но их нетрудно построить. Вам может быть проще использовать Solr , где вам нужно меньше программирования. Однако я не знаю, допускает ли Solr открытую схему, подобную той, что я описал, - я считаю, что вы должны предварительно задать все имена полей, так что это может помешать вам использовать Solr.

1 голос
/ 29 апреля 2010

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

Предложите ввести пользовательский поисковик, который выполняет следующее.

1.Читайте краткие документы, используя идентификатор документа. (Я предполагаю, что метод collect () может быть переопределен для передачи идентификатора документа из функции search () класса IndexSearcher).
2. Получите значение поля и проверьте наличие ожидаемых ключевых слов.
3.Представьте документ для оценки, только если документ соответствует вашим пользовательским критериям.

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

...