【问题标题】:Can Solr join tables in-memory?Solr 可以在内存中连接表吗?
【发布时间】:2012-02-02 19:58:26
【问题描述】:

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

【问题讨论】:

    标签: performance solr subquery dataimporthandler


    【解决方案1】:

    这可以使用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 的索引是 'flat',feature_namedescription 没有以任何方式连接;每个product 都将具有多值字段。

    【讨论】:

      【解决方案2】:

      我不确定 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 来分隔多个值。

      【讨论】:

      • 我已经将这种技术用于单值子实体(如标签),但是对于具有多个字段的子实体,您将如何做到这一点? 我已更新问题以反映这一点。
      • GROUP_CONCAT() 将获取给定 id 的所有描述值,并在结果的单个列中返回它们。描述的各个值将用逗号分隔。然后,您可以在索引之前使用 RegexTransformer 以逗号分隔。
      • 你误解了我的意思。如果我在子实体中有 两个 字段,它们属于一起,例如每个产品都有很多功能,每个功能都由一个名称一个描述组成?
      • 不确定,可能使用 GROUP_CONCAT() 两次。例如,如果特征表有一个名为 fname 的列,那么您可以尝试SELECT id, name, GROUP_CONCAT(description) AS desc, GROUP_CONCAT(fname) AS fn FROM item INNER JOIN feature ON (feature.item_id = item.id) GROUP BY id
      猜你喜欢
      • 2015-01-19
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多