разработка схемы Solr для многих определений сущностей - PullRequest
5 голосов
/ 14 сентября 2011

Я пытаюсь разработать схему для сценариев, в которых существует связь «многие ко многим» между продуктами и поставщиками.Поиск может быть сделан с помощью продукта или поставщика.Продукт может поставляться многими поставщиками, и у поставщика будет много продуктов.Ниже приводится решение, о котором я думаю, но кажется, что в определениях полей много избыточности, нужно ли мне два определения сущностей для поддержки поиска, ориентированного на продукт или поставщика.Не выглядит оптимальным.

При поиске поставщика можно определить «продукт» «multiValue = true» При поиске продукта можно определить «поставщик» «multiValue = true»

<!-- Field definitions to support supplier search -->
<field name="s_supplier" type="string" indexed="true" stored="true" >
<field name="s_product"  type="string" indexed="true" stored="true" multiValue="true">

<!-- Field definition to support product search -->
<field name="p_product"  type="string" indexed="true" stored="true" >
<field name="p_supplier"  type="string" indexed="true" stored="true" multiValue="true">

Определение сущности в обработчике данных:

<entity name="products" ....>
   <field name="p_product" column="">
   <entity name="suppliers">
      <field name="p_supplier">
    </entity>
</entity>

<entity name="suppliers" ....>
   <field name="s_supplier" column="">
   <entity name="products">
      <field name="s_product" column="">
    </entity>
</entity>

1 Ответ

9 голосов
/ 14 сентября 2011

Прелесть поисковой системы Solr в том, что вы можете просто выбрать одно определение схемы, ориентированное либо на продукт, либо на поставщика, а затем использовать возможности Solr для достижения желаемых результатов. Допустим, вы идете с продуктом, ориентированным на продукт, используя следующее:

<field name="product" type="string" indexed="true" stored="true" > 
<field name="supplier" type="string" indexed="true" stored="true" multiValue="true">

Теперь вы можете искать продукты, просто выполнив запрос к полю продукта product:my product, а затем, если вы хотите найти конкретного поставщика, вы можете просто использовать supplier:my supplier, а поле поставщика - это многозначное поле, связанное с с каждым продуктом вы получите все продукты, с которыми связан этот поставщик.

Другим вариантом для большей гибкости может быть использование поля text, определенного в примере файла schema.xml, и использование функции 'copyfield для копирования значений как поставщика, так и продукта в одно поле, после чего вы можете выполнить поиск в нем. либо получит все документы, которые соответствуют запросу в поле поставщика или продукта.

Вот пример, все еще использующий поля, определенные выше.

<field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
<copyField source="product" dest="text" />
<copyField source="supplier" dest="text" />

Тогда, если вы ищете text:my term, это может быть либо продукт, либо поставщик, и будут возвращены все документы в индексе, соответствующие этому полю. Обратите внимание, что к текстовому полю применяются специальные анализаторы индекса и времени запроса, поэтому вы должны знать, что применяется.

Кроме того, если вам нужно составить список уникальных поставщиков, вы можете использовать Solr Faceting, чтобы получить этот список из всех документов в индексе или относящихся только к текущим критериям поиска.

Для получения более подробной информации по этим темам см. Некоторые из следующих ссылок:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...