基于单场的Solr交叉口

时间:2014-08-04 18:41:13

标签: solr lucene

我有两个查询在Solr中的同一组字段上运行并返回唯一ID(另一个solr字段)。 如何从两个搜索查询中计算两个查询的交集或仅计算唯一的Id。 我知道我可以在客户端单独运行这些并找到唯一的但我想知道有没有办法我可以通过发送到SOLR的单个搜索来做到这一点。 以下是我所看到的一切。

Solr Fields:

<fields>
    <field name="key" type="uuid" indexed="true" required="true"/>
    <field name="tagname" type="string" indexed="true"  required="false"/>
    <field name="tagvalue" type="string" indexed="true" required="false"/>
</fields>

现在我想做的是

(tagname:xyz and tagvalue:123)&fl=key

这会返回一个键列表

(tagname:abc and tagvalue:456)&fl=key

这也会返回一个关键列表

现在从两个列表中获取/唯一键的交集。

通过运行某种solr交集查询,可以一步完成所有过程吗?

或者我需要采取其他任何solr架构设计吗?我很开放。

2 个答案:

答案 0 :(得分:0)

过滤器查询将执行您想要的操作。它们在您的查询中被指定为fq params,并与主查询结果相交。例如:

q=(tagname:xyz and tagvalue:123)&fq=(tagname:abc and tagvalue:456)&fl=key

以下内容将产生相同的结果:

q=*:*&fq=(tagname:xyz and tagvalue:123)&fq=(tagname:abc and tagvalue:456)&fl=key

第二种形式的执行速度可能稍快,因为q=*:*是常量评分,而过滤查询则没有评分。根据您的疑问,我猜测得分对您来说不是什么大问题。

编辑:这个答案是完全错误的!见评论。

答案 1 :(得分:0)

Solr喜欢非规范化数据。使用现有架构,您需要运行两个查询并在客户端上交叉结果。但是,稍微不同的架构可以实现您所需的内容:

<fields>
    <field name="key" type="uuid" indexed="true" required="true"/>
    <field name="tags" type="string" indexed="true" multiValued="true" required="false"/>
</fields>

您可以使用此架构的一种方法是将代码索引为<name>_<value>,同一文档中的给定键的所有标记。构建索引的工作量更大,但在查询时,您可以执行q=tags:xyz_123 AND tags:abc_456&fl=key并通过单个查询获得所需的结果。 Atomic updates可以帮助您构建或维护索引,但它确实需要存储所有字段。