3

有一个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 使其分别运行这些查询并将它们加入内存中?将获取两个表中的所有行。

4

2 回答 2

3

这可以使用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>

由于 Solr 的索引是“平坦的”,feature_name并且description没有以任何方式连接;每个都product将具有每个这些的多值字段。

于 2012-02-10T12:27:43.240 回答
1

我不确定 Solr 是否可以做到这一点,但数据库可以。假设您使用的是 MySQL,请使用JOINGROUP_CONCAT将其转换为单个查询。查询应如下所示:

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

不要忘记使用RegexTransformerdesc分离出多个值。

于 2012-02-03T08:56:40.020 回答