【问题标题】:Search multiple SOLR core's and return one result set搜索多个 SOLR 内核并返回一个结果集
【发布时间】:2018-06-18 14:42:41
【问题描述】:

我们在 SOLR 中设置了多个核心,并希望在这些核心中进行搜索并返回单个结果集。

更多背景知识: 我们有一个 SOLR 核心,用于索引我们的内部博客引擎。我们还有一个 SOLR 核心,用于索引我们的 CMS 系统。我们希望搜索这两个核心,但查看单个结果集。

我知道文档中有相关实体,但我们希望将核心分开,以便于维护和冗余。

我们使用 SolrSharp 作为搜索 SOLR 的包装器。 任何建议或指导将不胜感激。

【问题讨论】:

  • 您使用的是什么客户端平台?
  • 我们使用 SolrSharp 作为 SOLR 的包装器。

标签: solr


【解决方案1】:

自 Solr 1.3 以来,Solr 中已经有了不错的多核搜索功能。请阅读Distributed Search 文章,其中解释了如何使用 shards 参数跨多个内核进行查询并将结果作为一个数据集返回。

【讨论】:

  • 分布式搜索是否可以跨多个不同的内核工作?自己没有尝试过,但我想知道如果核心 A 具有字段“名称”和“标题”而核心 B 具有字段“名称”和“摘要”,因此它们不匹配会不会不开心?或者您会根据需要取回姓名、摘要和标题吗?
  • Eric - 我的策略是使用具有合并架构的单独核心,该架构实现了请求处理程序来搜索多个分片。这样客户端就不用担心提供“shards”参数了。
  • 因此,如果我有 Core0 的字段 documentId、fieldA、fieldB 和 Core1 的字段 documentId、fieldC、fieldD。然后我创建另一个核心,假设 Core3 具有字段 documentId、fieldA、fieldB、fieldC、fieldD。我永远不会将数据导入这个核心?然后创建一个包含 shard 参数的查询处理程序。因此,当我查询 Core3 时,它永远不会真正包含索引数据,但由于分片搜索,它会将结果从另一个核心获取,并将其“呈现”在第三个核心上?感谢您的帮助!
  • Rihan - 这就是我推荐的地方。
  • 您能为此提供一个示例配置吗? Core3 与查询处理程序?谢谢!
【解决方案2】:

无法跨多个内核执行单个查询。另一个答案中提到的分布式搜索与跨系统拆分索引的分片有关。

事实上,多核实际上是为了在每个核中存储单独和不同的结构,查询多个核应该没有意义。正如一些在之前的 cmets 中提到的那样,您可以拥有一个额外的核心来保存您的所有字段 - 尽管您可能必须重命名这个新核心中的字段,以便可以同时存储名称相似但类型不同的字段。

【讨论】:

    【解决方案3】:

    马修的回答完全正确。碎片和多核是苹果和橘子。您不能跨多个核心进行统一的单个查询。您必须对每个核心执行单独的查询 (http://localhost:8983/solr/core0/select?q=: ,http://localhost:8983/solr/core1/select?q= )。但是,使用分片 (http://localhost:8983/solr/select?shards=localhost:8983/solr,localhost:8984/solr&q=:)。

    【讨论】:

      【解决方案4】:

      分布式搜索是正确的答案。 我建议直接在处理程序中配置分布式搜索。 您可以在处理程序中配置 localhost,尽管您可以在外部调用 solr。 现在您可以调用搜索处理程序,它将自动搜索所有配置的核心:

      http://solrhost:8983/solr/core1?q=:

      <requestHandler name="/multicore" class="solr.SearchHandler">
        ...
        <lst name="invariants">
          <str name="shards">localhost:8983/solr/core1,localhost:8983/solr/core2</str>
        </lst>
      </requestHandler>
      

      【讨论】:

      • 如果 core1 和 core2 有不完全相同的模式,结果是不可预测的。毕竟,这对于基于模式的 Solr 来说是不合理的。总之,对于 Solr 来说,这个棘手的问题没有糖的答案。即使对于 Elasticsearch,你仍然需要编写代码来检查文档是哪种数据源类型,然后从特定文档中提取相应的字段(key=field name)。
      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      相关资源
      最近更新 更多