2014-09-27 4 views
0

У меня есть база данных книг, которая имеет три объекта: книги, страницы и заголовки (названия, найденные на странице). Я запутался и обеспокоен работой между двумя подходами в схеме:Дизайн и производительность схемы Solr

1 - Работа с книгами как документами в поле книги, полеми страниц с полем multiValue и заголовками с multiValue. В этом подходе все данные книги будут представлены в одном документе Solr с очень большими полями.

2 - обработка страниц как документов, которые будут вестись в гораздо меньших полях, но большего количества документов.

Я попытался посмотреть this official resource, но я не смог найти четкого ответа на мой вопрос.

+0

Заполните описание для каждого стола и то, что вы планируете искать в Solr. – orangepips

+0

@orangepips Это просто, книга имеет много страниц, а затем страница имеет много названий. – SaidbakR

ответ

1

Предполагая, что вы собираетесь принимать результаты Solr и представлять их через другое приложение, я бы сделал наименьший элемент - Titles - модель для документов, что облегчит представление, где появится результат. Выполнение этого способа сводит к минимуму количество кода приложения, которое необходимо написать. Если ваши пользователи обращаются к Solr напрямую, я могу вместо этого использовать страницу в качестве моего документа - предположительно, вы используете Solr's highlighting feature, чтобы помочь своим пользователям определить, как их поисковый запрос (ы) совпадают.

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

  1. Книга ID + Номер страницы + Заглавие [строка - уникальный ключ]
  2. Книга ID [целое]
  3. Название книги [лексемы текст поле]
  4. Номер страница [TrieIntField]
  5. название [лексемы текстовое поле]
  6. Содержимое для этой комбинации книги/название/страницы [лексемы т ext field]

Могут быть другие атрибуты, которые вы хотите захватить, такие как автор, дата публикации, издатель, но вы не объясните выше, какую другую информацию у вас есть, поэтому я оставляю это в этом примере.

Текстуальные запросы могут затем включать Book Name, Title и Content, где вы можете определить одно поле, что индексируется, но не сохраняется, что служит в качестве мишени для <copyField/> деклараций в вашем schema.xml, чтобы обеспечить легкий поиск по всем три в то же время.

Для индексации, не зная больше об индексируемых данных, я бы использовал ICU Tokenizer и Snowball Porter Stemming Filter со спецификацией языка в текстовых полях для обработки неанглийских данных - при условии, что все книги находятся на одном языке. И если английский, стандартный токенизатор вместо ICU.

+0

Замечательное объяснение, но, как вы думаете, что схема схемы, которую вы предложили, приведет к полу-повторным документам ?! Поскольку у страницы много названий, поэтому, если у нас есть страница с тремя заголовками, мы получим три документа с теми же данными, кроме поля заголовка. В этой ситуации большое количество идентичных данных (содержание - содержание страницы, которое я имею в виду здесь) должно индексироваться три раза. Тем не менее, ваш анализ заставляет меня принять второй дизайн, о котором я спросил в вопросе, создав поле title multiValues. – SaidbakR

+1

У вас будут абсолютно полу-повторные документы, но это точка индекса поиска, а не реляционная база данных IMO: денормализовать ваши данные, чтобы упростить поиск. – orangepips