Ассоциации Solr

Последние дни мы думаем об использовании 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>

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

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

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

Заранее спасибо, Tom

6
задан Tom 22 April 2010 в 08:56
поделиться

4 ответа

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

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

  • Поиск идентификатора категории по тексту имени.
  • Поиск предприятий по идентификатору категории.
4
ответ дан 17 December 2019 в 02:25
поделиться

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

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

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

0
ответ дан 17 December 2019 в 02:25
поделиться

На самом деле существует класс фильтра с именем 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, программное обеспечение, ИТ

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

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

alt text

Как видите, оно превратило программное обеспечение в

1

Обратите внимание, что для параметра

expand

НЕОБХОДИМО установить значение

false

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

Дэйв

2
ответ дан 17 December 2019 в 02:25
поделиться

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

0
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: