Lucene: как искать EAV или 1:m?

Я использую Zend Lucene, но не думаю, что вопрос специфичен для этой библиотеки.

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

Модель 1:

TABLE: book
- book_id
- name

TABLE: book_author
- book_author_id
- book_id
- author_id

TABLE: author
- author_id
- name

(книга может иметь 0 или более авторов)

Модель 2:

TABLE: book
- book_id
- name

TABLE: book_eav
- book_eav_id
- book_id
- attribute (e.g. "author")
- value (e.g. "Tom Clancy")

(в книге может быть 0 или более авторов + информация об издателе, количестве страниц и т. д.)

Что мне нужно сделать, чтобы вставить всех авторов, связанных с конкретной книгой, в индексируемый документ? Размещать ли всех авторов в одном поле документа? Буду ли я использовать какой-либо разделитель для группировки информации об авторе? Я ищу общие стратегии с такими данными.

1 ответ

Решение

Поместите всех авторов в одно поле в документе с разделителем. Таким образом, схема документа будет:

book_id
name
author: |author 1|author 2|...|author n|
other_attribute_1: |val 1|val 2|
other_attribute_2: |val 1|val 2|

С помощью этой схемы вы можете осуществлять поиск по автору с различными бустами с помощью запроса, например:

(author:"|Tom Clancy|")^10 OR 
(author:"Tom Clancy")^5 OR 
(author:Tom Clancy)^1

Этот запрос сначала покажет точные совпадения, затем совпадения фраз и, наконец, другие совпадения.

Другие вопросы по тегам