如果我没有可用的智能客户端,我很难准确理解索引和查询是如何工作的。我使用的是SolrNet和C#,目前还没有与ZooKeeper集成。
作为一个基本示例,假设我有一个集合,分成两个碎片,在两个不同的节点/服务器上复制,并且在服务器前面有一个标准的HTTP负载均衡器(一个提到的here场景)。如果我使用标准的compositeId路由器,我相信索引可以在没有问题的情况下工作,并且在幕后由ZooKeeper复制到两个节点。我不需要担心哪个节点收到了"update“命令-- ZooKeeper将自动处理文档路由和复制。
但是,在同样的场景中,ZooKeeper是否能够正确地处理幕后的查询路由?考虑到我使用的是内置切分而不是自定义切分,对负载均衡器的查询请求会被路由到正确的碎片,还是必须在“碎片”参数中包含所有已知的碎片(请参阅here)以确保不遗漏任何内容?显然,随着碎片数量的增加,这将是很难维持的。
似乎自定义切分将提供最大的效率跨索引和查询,尽管这样您就风险巨大的不平等的碎片大小。如对这些事项有任何想法,将不胜感激。
发布于 2015-06-03 08:06:57
让我们以两个碎片集合为例,每个碎片位于一个单独的节点/服务器上。
10.x.x.100:8983/solr/ -> shard 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/上运行相同的查询,返回的结果将是来自两个碎片的结果的组合,并按分数进行排序和排序。
当您知道数据的“组”在哪个碎片中时,就会显示&shards参数。例如,使用上面的示例,您已启用自定义路由,并使用字段"city“路由文档。例如,让我们假设"city“字段只能有两个值。您的文档将根据此字段路由到其中一个碎片。
在应用程序端,如果希望专门查询属于城市的文档,可以指定&shard参数,查询的所有结果将仅来自该碎片。
https://stackoverflow.com/questions/30604221
复制相似问题