有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使其单独运行这些查询并将它们连接到内存中?将获取两个表中的所有行。
答案 0 :(得分:3)
<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
将为每个{{1}}提供多值字段。
答案 1 :(得分:1)
我不确定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
不要忘记使用desc
上的RegexTransformer来分隔多个值。