查询solr中具有不同字段的多个集合

查询solr中具有不同字段的多个集合,solr,Solr,给定以下(单核)查询: 第一个查询返回“numFound”:40000 第二个查询返回“numFound”:10000 我试着通过以下方式将它们组合在一起: http://localhost/solr/a/select?indent=true&shards=localhost/solr/a,localhost/solr/b&q=*:*&rows=100&start=0&wt=json 现在我得到了“numFound”:50000。 唯一的问题是“a

给定以下(单核)查询:

第一个查询返回“numFound”:40000 第二个查询返回“numFound”:10000

我试着通过以下方式将它们组合在一起:

   http://localhost/solr/a/select?indent=true&shards=localhost/solr/a,localhost/solr/b&q=*:*&rows=100&start=0&wt=json
现在我得到了“numFound”:50000。 唯一的问题是“a”比“b”有更多的列,所以多个集合请求只返回a的值


可以用不同的字段查询多个集合吗?或者它们必须是相同的吗?我应该如何更改我的第三个url以获得此结果?

您需要的是-我称之为-一个统一核心。该模式本身将没有内容,它仅用作一种包装器,用于统一您希望从两者显示的字段核心。在那里你需要

  • 一个schema.xml,它封装了您希望在统一结果中包含的所有字段
  • 为您组合两个不同核心的查询处理程序
一个重要的限制预先从

文档必须具有唯一密钥,并且必须存储唯一密钥(schema.xml中的stored=“true”)。唯一密钥字段必须在所有碎片中都是唯一的。如果遇到具有重复唯一密钥的文档,Solr将尝试返回有效结果,但行为可能是不确定的

例如,我有shard-1和字段id、title、description,shard-2和字段id、title、abstractText

碎片-1的模式


碎片-2的模式


为了统一这些模式,我创建了第三个模式,我称之为碎片统一,它包含所有四个字段


现在我需要使用这个组合模式,因此我在solr统一核心的solrconfig.xml中创建了一个查询处理程序


埃迪斯马克斯
*:*
id标题描述摘要文本
*,得分
100%
就是这样。现在shard-1和shard-2中需要一些索引数据。要查询统一的结果,只需使用适当的shard参数查询shard unification

http://localhost/solr/shard-unification/select?q=*:*&rows=100&start=0&wt=json&shards=localhost/solr/shard-1,localhost/solr/shard-2
这将返回如下结果

{
“负责人”:{
“状态”:0,
“QTime”:10},
“响应”:{“numFound”:2,“start”:0,“maxScore”:1.0,“docs”:[
{
“id”:1,
“标题”:“标题1”,
“说明”:“说明1”,
“分数”:1.0},
{
“id”:2,
“标题”:“标题2”,
“摘要文本”:“摘要2”,
“分数”:1.0}]
}}
获取文档的原始碎片 如果要将原始碎片提取到每个文档中,只需在
fl
中指定
[shard]
。作为查询的参数或requesthandler的默认值,请参见下文。括号是必需的,它们也将出现在结果响应中


埃迪斯马克斯
*:*
id标题描述摘要文本
*,分数,[碎片]
100%
工作样本
如果你想看到一个正在运行的示例,请在github和上签出。我现在还包括了碎片获取。

碎片应该在Solr中使用

当索引变得太大而无法在单个系统上运行时,或者当单个查询执行时间太长时

因此,列的数量和名称应始终相同。这在本文档中有规定(前面的引用也来自此文档):

如果您保持查询的原样,并使两个具有相同字段的碎片按预期工作

如果你想了解更多关于碎片在Solr中如何工作的信息,还可以查看以下文档:

你怎么知道返回了哪个id(哪个碎片)?@Vincent我已经包含了一段关于它的内容,你可以获取碎片的URL。这应该可以达到目的。现在我有这样的数据:“碎片-1{id:'1';标题:'test1',描述:'test1Des',碎片-2{id:'1';标题:'test2',摘要文本:'test2Des};URL:。如何合并结果?@OliviaWang,正如我在答案的开头所引用的那样,这种方法需要跨碎片的唯一ID。可能要执行联接?我想这会引出一个话题。。。自己的问题?@Vincent如果您的示例结果没有加入结果,那么在两个碎片之间搜索的意义是什么?现在我有这个要求,所以我应该加入结果,我如何实现它?如果所有碎片都属于同一个集合,那么您是正确的。事实上,同一个集合中总是有相同的列,因为列是在属于该集合的模式中定义的。然而,问题是如何“查询多个集合”。在不同的集合中,您可能有不同的列集合。您的意思是“b”的列比“a”的列多吗?如果“b”列是“a”列的子集——我理解你的问题——我不理解这里的问题。
http://localhost/solr/shard-unification/select?q=*:*&rows=100&start=0&wt=json&shards=localhost/solr/shard-1,localhost/solr/shard-2