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

StackOverflow https://stackoverflow.com/questions/401754

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Затем вы можете выполнить поиск по чему-то вроде:

stock market AND category:(+"business")

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top