Может ли Solr объединять таблицы в памяти? - PullRequest
3 голосов
/ 02 февраля 2012

Существует таблица n продуктов и таблица характеристик этих продуктов. Каждый продукт имеет много функций. Учитывая конфигурацию Solr DataImportHandler :

<document name="products">
  <entity name="item" query="select id, name from item">
    <field column="ID" name="id" />
    <field column="NAME" name="name" />
    <entity name="feature" 
      query="select feature_name, description from feature where item_id='${item.ID}'">
      <field name="feature_name" column="description" />
      <field name="description" column="description" />
    </entity>
  </entity>
</document>

Solr будет запускать n + 1 запросов для извлечения этих данных. 1 для основного запроса, n для запросов на выборку функций. Это неэффективно для большого количества предметов. Можно ли настроить Solr так, чтобы он выполнял эти запросы отдельно и вместо этого объединял их в памяти? Будут извлечены все строки из обеих таблиц.

Ответы [ 2 ]

3 голосов
/ 10 февраля 2012

Это можно сделать с помощью CachedSqlEntityProcessor :

<document name="products">
  <entity name="item" query="select id, name from item">
    <field column="ID" name="id" />
    <field column="NAME" name="name" />
    <entity name="feature" 
        query="select item_id, feature_name, description from feature"
        cacheKey="item_id"
        cacheLookup="item.ID" 
        processor="CachedSqlEntityProcessor">
      <field name="feature_name" column="description" />
      <field name="description" column="description" />
    </entity>
  </entity>
</document>

Поскольку индекс Солра «плоский», feature_name и description никак не связаны;каждый product будет иметь многозначные поля для каждого из них.

1 голос
/ 03 февраля 2012

Я не уверен, может ли Solr сделать это, но база данных может.Предполагая, что вы используете MySQL, используйте JOIN и GROUP_CONCAT , чтобы преобразовать это в один запрос.Запрос должен выглядеть примерно так:

SELECT id, name, GROUP_CONCAT(description) AS desc FROM item INNER JOIN feature ON (feature.item_id = item.id) GROUP BY id

Не забудьте использовать RegexTransformer в desc для выделения нескольких значений.

...