Поле, имеющее несколько различных значений
Создаем API "Поиск книг" с помощью Lucene.
Мне нужно индексировать поля "Имя книги", "Автор" и "Книжная категория" в индексе Lucene.
Одна книга может подпадать под несколько разных категорий книг... например:
BookName1 - художественная литература, юмор, философия.
BookName1 - научная фантастика.
BookName1 --humour, бизнес.
BookName4-юмор
и т.д.
Пользователь должен иметь возможность искать все книги под определенной категорией, например, "homour".
Учитывая эту ситуацию, как я могу индексировать выше поля и строить запрос в lucene?
Ответы
Ответ 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, все это завернуто по нескольким клиентским библиотекам, поэтому вам не нужно обрабатывать низкоуровневые детали обработки запросов самостоятельно.
Есть много отличный документация на их веб-сайт, чтобы вы начали.