Solr ассоциации - PullRequest
       34

Solr ассоциации

6 голосов
/ 22 апреля 2010

Последние пару дней мы думаем об использовании Solr в качестве нашей поисковой системы.Большинство функций, которые нам нужны, являются готовыми или могут быть легко настроены.Однако есть одна особенность, которая нам абсолютно необходима, которая, кажется, хорошо скрыта (или отсутствует) в Solr.

Я попытаюсь объяснить на примере.У нас есть много документов, которые на самом деле являются бизнесом:

<document>
  <name>Apache</name>
  <cat>1</cat>
  ...
</document>
<document>
  <name>McDonalds</name>
  <cat>2</cat>
  ...
</document>

Кроме того, у нас есть еще один XML-файл со всеми категориями и синонимами:

<cat id=1>
  <name>software</name>
  <synonym>IT<synonym>
</cat>
<cat id=2>
  <name>fast food</name>
  <synonym>restaurant<synonym>
</cat>

Мы хотим связать как компании, так и категориипоэтому мы можем искать, используя имя и / или синонимы категории.Но мы не хотим объединять эти файлы во время индексации, потому что мы должны обновить категории (добавление. Удаление синонимов ...) без повторной индексации всех предприятий.

Есть ли в Solr что-нибудь, что делает этот видассоциации или нам нужно разработать некоторые конкретные части?

Все отзывы и предложения приветствуются.

Заранее спасибо, Том

Ответы [ 4 ]

4 голосов
/ 22 апреля 2010

В основном у вас есть дизайнерское решение здесь. Обычные вещи, которые люди делают с индексами Solr, - это их денормализация, т. Е. Развертывание определения категории в бизнес-документе. Поскольку вы не хотите этого делать, я предлагаю хранить два типа документов - один для предприятий и другой для категорий. Вы можете хранить оба в одном индексе, поскольку Solr не требует, чтобы все документы имели одинаковые поля. Деловые документы кажутся простыми, но вы должны сделать их доступными для поиска как по названию компании, так и по идентификатору категории. Я предлагаю создать документ категории для каждого синонима, в котором вы осуществляете поиск по синониму и находите идентификатор (и название категории).

Для поиска по синонимам вам потребуется двойной поиск -

  • Поиск идентификатора категории по тексту имени.
  • Поиск предприятий с использованием идентификатора категории.
2 голосов
/ 23 апреля 2010

На самом деле существует класс фильтра с именем solr.SynonymFilterFactory .

Это должно позволить вам сопоставить номера кошек с двумя текстовыми эквивалентами, если вы используете их только в анализаторе запросов, что-то вроде следующего:

    <fieldType name="category" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="category_Synonyms.txt" ignoreCase="true" expand="false"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Таким образом, вы можете индексировать ТОЛЬКО идентификатор категории. Это означает, что вам не нужно будет снова отправлять все предприятия в Solr. Также, если кто-то запрашивает"программное обеспечение" или "ИТ", он сопоставит его с категорией

Ваш category_Synonyms.txt должен содержать следующие строки:

1, программное обеспечение, IT

Единственный вывод, что вам придётся придумать способ редактирования текстового документа при изменении имен или синонимов. Так что я думаю, это поможет, только если вы редко меняете названия категорий ?? Если кто-то еще не знает, как это можно сделать легко.

Я фактически добавил вышеупомянутое в свой собственный solr и запустил инструмент Analyzer на нем .. вот результат:

alt text

Как вы можете видеть, оно превращено в

.

1

Обратите внимание, что вы ДОЛЖНЫ установить

расширение

параметр до

ложь

Надеюсь, это поможет.

Dave

0 голосов
/ 26 апреля 2010

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

0 голосов
/ 22 апреля 2010

Невозможно найти неиндексированные фрагменты информации, если вы не внедрили какой-либо вид перевода / расширения запроса, который переводит некоторые термины запроса в их индексированный эквивалент перед отправкой запроса.

Итак, если пользователь вводит слово «ресторан», то ваш запрос переводится, чтобы включить фильтр по cat = 1.

Насколько я знаю, Solr не включает эту функцию, поэтому вы должны реализовать ее самостоятельно или адаптировать подходящий модуль (например, http://lucene -qe.sourceforge.net / ).

...