Поле с несколькими различными значениями - PullRequest
24 голосов
/ 31 декабря 2008

Я создаю API "Поиск книг" с помощью Lucene. Мне нужно индексировать поля «Имя книги», «Автор» и «Категория книги» в индексе Lucene.

Одна книга может относиться к разным категориям книг ... например:

BookName1 - сочинение, юмор, философия. BookName1 - наука, наука. BookName1 - юмор, бизнес. BookName4-юмор и так далее .....

Пользователь должен иметь возможность искать все книги в определенной категории, скажем "homour".

Учитывая эту ситуацию, как мне проиндексировать вышеуказанные поля и построить запрос в lucene?

Ответы [ 3 ]

32 голосов
/ 05 января 2009

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

  • создать новый документ lucene
  • добавить имя поля и значение
  • добавить поле автора и значение
  • для каждой категории:
    • добавить поле категории и значение
  • добавить документ в указатель

Когда вы будете искать в индексе категорию, он вернет все документы, которые имеют поле категории со значением, которое вы ищете. Категория должна быть полем «Ключевое слово».

Я написал это по-английски, потому что конкретный код немного отличается для версии lucene.

5 голосов
/ 31 декабря 2008

Вы можете создать простое поле «категория», в котором вы перечисляете все категории для книги, разделенной пробелами.

Тогда вы можете искать что-то вроде:

stock market AND category:(+"business")

Или, если вы хотите искать в более чем одной категории

stock market AND category:(+"business" +"philosophy")
4 голосов
/ 31 декабря 2008

Я бы использовал Solr вместо этого - он построен на Lucene и управляется ASF, но намного, намного проще в использовании, чем Lucene, особенно для новичков.

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

В Solr вы просто определили бы поля, которые хотите проиндексировать, примерно так: schema.xml:

<field name="book_id" type="string" indexed="true" stored="true" required="true" multiValued='false'/>
<field name="book_name" type="text" indexed="true" stored="true" required="true" multiValued='false' />
<field name="book_authors" type="text" indexed="true" stored="true" required="true" multiValued='true' />
<field name="book_categories" type="textTight" indexed="true" stored="true" required="true" multiValued='true' />

Обратите внимание, что атрибут multiValued='true' позволяет эффективно передавать массив или список в это поле, которое хорошо разбивается и индексируется Solr.

Как только вы это сделаете, запустите Solr, и вы сможете задавать вопросы, такие как "book_authors:Hemingway" или "book_categories:Romance book_categories:Mills".

Существует несколько обработчиков запросов, предварительно написанных и настроенных для таких вещей, как разбор сложных запросов (нечеткие совпадения, логические операции, повышение скоринга и т. Д.), А поскольку API Solr предоставляется через HTTP, все это переносится в оболочку. рядом клиентских библиотек, поэтому вам не нужно обрабатывать детали низкоуровневого создания запросов самостоятельно.

На их веб-сайте есть множество замечательных документов , с которых можно начать.

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