Solr可以将表连接到内存中吗?

时间:2012-02-02 19:58:27

标签: performance solr subquery dataimporthandler

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 个答案:

答案 0 :(得分: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_namedescription没有任何关联;每个product将为每个{{1}}提供多值字段。

答案 1 :(得分: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

不要忘记使用desc上的RegexTransformer来分隔多个值。