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