没有智能客户端的 SolrCloud Indexing/Querying

SolrCloud Indexing/Querying without a Smart-Client

如果我没有可用的智能客户端,我很难准确理解索引和查询的工作原理。我将 SolrNet 与 C# 一起使用,它目前未与 ZooKeeper 集成。

作为一个基本示例,假设我有一个集合,分成两个分片,复制到两个单独的 nodes/servers,并且我在服务器前面有一个标准的 HTTP 负载平衡器(一个场景提到 here)。如果我使用标准的 compositeId 路由器,我 相信 索引将毫无问题地工作,并由 ZooKeeper 在幕后复制到两个节点。我不需要担心哪个节点接收到 "update" 命令——ZooKeeper 会自动处理文档路由和复制。

但是,在同样的情况下,ZooKeeper 会在幕后正确处理查询路由吗?鉴于我使用的是内置分片而不是自定义分片,对负载均衡器的查询请求是否会被路由到正确的分片,或者我是否必须包含 all 已知分片在 "shards" 参数中(参见 here)以确保我没有遗漏任何内容?显然,随着分片数量的增加,维护起来会很麻烦。

似乎自定义分片会在索引和查询之间提供最大的效率,尽管那样你 运行 风险分片大小非常不相等。如果对这些问题有任何想法,我们将不胜感激。

让我们以两个分片集合为例,每个分片在一个单独的 node/server.

10.x.x.100:8983/solr/ --> 分片 1 / 节点 1

10.x.x.101:8983/solr/ --> 分片 2 / 节点 2

您使用默认路由为 100 个文档编制了索引,这些文档被拆分到这两个服务器中,现在它们各有 50 个文档。

如果您在两个服务器中的任何一个服务器上查询文档,默认情况下 solr 将在两个分片中搜索。您不需要在 shards 参数中指定任何内容。

所以

10.x.x.100:8983/solr/collection/select?q=solr rocks

也会 运行 在 10.x.x.101:8983/solr/ 上进行同样的查询,返回的结果将是两个分片结果的组合,按分数排序和排名。

当您知道哪个 "group" 数据在哪个分片中时,&shards 参数就会出现。例如,使用上面的示例,您启用了自定义路由,并使用字段 "city" 来路由文档。例如,假设 "city" 字段只能有两个值。您的文档将根据此字段路由到其中一个分片。

在你的应用端,如果你想专门查询属于某个城市的文档,你可以指定&shard参数,查询的所有结果将只来自该分片。