基于单场的Solr求交
我在Solr中的同一组字段上运行了两个查询,并返回了另一个Solr字段的唯一ID。 如何计算两个查询的交集或两个搜索查询的唯一Id。 我知道我可以在客户端单独运行这些,并找到唯一的,但我想知道是否有一种方法可以通过发送给SOLR的单个搜索来实现这一点。 这就是我这边的一切 Solr字段:基于单场的Solr求交,solr,lucene,Solr,Lucene,我在Solr中的同一组字段上运行了两个查询,并返回了另一个Solr字段的唯一ID。 如何计算两个查询的交集或两个搜索查询的唯一Id。 我知道我可以在客户端单独运行这些,并找到唯一的,但我想知道是否有一种方法可以通过发送给SOLR的单个搜索来实现这一点。 这就是我这边的一切 Solr字段: <fields> <field name="key" type="uuid" indexed="true" required="true"/> <field nam
<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>
现在我想做的是
标记名:xyz和标记值:123&fl=键
这将返回一个密钥列表
标记名:abc和标记值:456&fl=键
这还将返回一个密钥列表
现在从以上两个列表中获取/unique键的交点
通过运行某种solr交叉点查询,可以一步完成所有过程吗
或者我还需要其他solr模式设计吗?我对此持开放态度。筛选查询将满足您的要求。它们在查询中被指定为fq参数,并与主查询结果相交。例如:
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=*:*是常量评分,而过滤器查询没有评分。根据你的提问,我猜得分对你来说没什么大不了的
编辑:这个答案完全错了!参见注释。Solr喜欢非规范化数据。对于现有模式,您需要运行两个查询,并在客户机上相交结果。但是,稍微不同的模式将启用您所寻找的:
<fields>
<field name="key" type="uuid" indexed="true" required="true"/>
<field name="tags" type="string" indexed="true" multiValued="true" required="false"/>
</fields>
使用此模式的一种方法是将标记索引为u,将给定键的所有标记放在同一文档中。构建索引需要更多的工作,但在查询时,您可以执行q=tags:xyz_123和tags:abc_456&fl=key,并通过单个查询获得所需的结果。可以帮助您建立或维护索引,但它需要存储所有字段。您的唯一id字段不是索引中的唯一键/唯一字段,对吗?每个标记名/标记值组合有一个文档,其中有一个重复的键值?i、 e.123/foo/bar,123/abc/value,123/xyz/baz正确的是,nique id字段不是唯一键/唯一字段。每个键/标记名/tagvalue组合都有一个文档,键/标记名/tagvalue组合将始终唯一地定义一个文档。我认为这对q=tagname:xyz和tagvalue:123&fq=tagname:abc和tagvalue:456&fl=key不起作用。当查询显示tagname:xyz时,每一行都会选择tagname:xyz。最后,当您尝试对标记名abc进行筛选时,不会选择任何内容。第二种方法也有同样的问题。你当然是对的。两个文档集的交集为∅, 询问者想要的是从文档集投影关键字段并与投影相交。是否可以执行我正在寻找的操作,或者我需要重新考虑我的设计。@user3799300可以执行您想要的操作,但不能使用当前的架构。我发布了第二个详细的答案。谢谢你的快速回复,你能告诉我一些资源吗?我可以用这些资源创建索引标记,如u,同一文档中给定键的所有标记。@user3799300应该可以做到,例如,从标记中选择键的顶级实体和从标记中选择标记名| |'|'| | tagvalue的子实体。自己查询数据库并手动构建文档也是一种选择,如果数据库没有JDBC驱动程序,这可能是您唯一的选择。