Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于单场的Solr求交_Solr_Lucene - Fatal编程技术网

基于单场的Solr求交

基于单场的Solr求交,solr,lucene,Solr,Lucene,我在Solr中的同一组字段上运行了两个查询,并返回了另一个Solr字段的唯一ID。 如何计算两个查询的交集或两个搜索查询的唯一Id。 我知道我可以在客户端单独运行这些,并找到唯一的,但我想知道是否有一种方法可以通过发送给SOLR的单个搜索来实现这一点。 这就是我这边的一切 Solr字段: <fields> <field name="key" type="uuid" indexed="true" required="true"/> <field nam

我在Solr中的同一组字段上运行了两个查询,并返回了另一个Solr字段的唯一ID。 如何计算两个查询的交集或两个搜索查询的唯一Id。 我知道我可以在客户端单独运行这些,并找到唯一的,但我想知道是否有一种方法可以通过发送给SOLR的单个搜索来实现这一点。 这就是我这边的一切

Solr字段:

<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驱动程序,这可能是您唯一的选择。