Lucene: как искать EAV или 1: m? - PullRequest
1 голос
/ 21 ноября 2011

Я использую 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 Ответ

0 голосов
/ 21 ноября 2011

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

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

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

...