Подтвердить что ты не робот

Поле, имеющее несколько различных значений

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Затем вы можете найти что-то вроде:

stock market AND category:(+"business")

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

stock market AND category:(+"business" +"philosophy")

Ответ 3

Я бы использовал 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, все это завернуто по нескольким клиентским библиотекам, поэтому вам не нужно обрабатывать низкоуровневые детали обработки запросов самостоятельно.

Есть много отличный документация на их веб-сайт, чтобы вы начали.