有一个 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 配置为单独运行这些查询并将它们加入内存中?将提取两个表中的所有行。

最佳答案

这可以使用 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 都将具有多值字段。

关于performance - Solr 可以连接内存中的表吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9119063/

10-16 10:02