- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当相同的应用程序代码在 SolrCloud 中对没有唯一键(应由 SOLR 自动生成)的文档建立索引失败并在独立 SOLR 实例(甚至在云模式下,但从副本之一的 Web 界面)。显然,差异仅存在于客户端(CloudSolrClient 与 HttpSolrClient)和 SOLR URL(Zokeeper 主机名+端口与独立 SOLR 实例主机名和端口)之间。
我正在使用 SOLR 5.1。在云模式下,我有 1 个分片和 3 个副本。 Documentation states :
Schema defaults and copyFields cannot be used to populate the uniqueKey field. You can use UUIDUpdateProcessorFactory to have uniqueKey values generated automatically.
因此,我已将 uniqueKey 字段添加到架构中:
<fieldType name="uuid" class="solr.UUIDField" indexed="true" />
...
<field name="id" type="uuid" indexed="true" stored="true" required="true" />
...
<uniqueKey>id</uniqueKey>
然后我将 updateRequestProcessorChain 添加到我的 solrconfig 中:
<updateRequestProcessorChain name="uuid">
<processor class="solr.UUIDUpdateProcessorFactory">
<str name="fieldName">id</str>
</processor>
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
并将其设为 UpdateRequestHandler 的默认值:
<initParams path="/update/**">
<lst name="defaults">
<str name="update.chain">uuid</str>
</lst>
</initParams>
从副本之一的 Web 界面添加具有 null/缺席 id 的新文档效果很好,就像在我的应用程序中以独立模式(非云)使用 SOLR 时一样。尽管仅当我使用 SolrCloud 并从应用程序添加文档(使用 SolrJ 中的 CloudSolrClient)时,它会失败并显示“org.apache.solr.client.solrj.SolrServerException: org.apache.solr.client.solrj.impl.HttpSolrClient$ RemoteSolrException:文档缺少强制 uniqueKey 字段:id”
所有其他操作(例如 ping 或搜索文档)在任一模式(独立或云)下都可以正常工作。
有人经历过同样的行为吗?这里可能有什么解决方案?
调查(即更多细节):
在独立模式下显然更新请求是:
POST standalone_host:port/solr/collection_name/update?wt=json
在SOLR云模式下,从一个副本的Web界面添加文档时,更新请求为(通过检查Web界面的调用发现):
POST replica_host:port/solr/collection_name_shard1_replica_1/update?wt=json
在这两种情况下,有效负载类似于:
{
"add": {
"doc": {
.....
},
"boost": 1.0,
"overwrite": true,
"commitWithin": 1000
}
}
使用CloudSolrClient时,出现以下情况(通过调试发现):
使用 ZK 和一些逻辑,构建副本的 URL 列表,如下所示:
[http://replica_1_host:port/solr/collection_name/,
http://replica_2_host:port/solr/collection_name/,
http://replica_3_host:port/solr/collection_name/]
此代码称为:
LBHttpSolrClient.Req req = new LBHttpSolrClient.Req(request, theUrlList);
LBHttpSolrClient.Rsp rsp = lbClient.request(req);
return rsp.getResponse();
第二行失败并出现异常。
如果进一步调试第二行,它最终会调用 HttpClient.execute(来自 HttpSolrClient.executeMethod):
POST http://replica_1_host:port/solr/collection_name/update?wt=javabin&version=2 HTTP/1.1
POST http://replica_2_host:port/solr/collection_name/update?wt=javabin&version=2 HTTP/1.1
POST http://replica_3_host:port/solr/collection_name/update?wt=javabin&version=2 HTTP/1.1
第一个请求返回 400 错误请求,副本 1 在日志中记录“文档缺少强制 uniqueKey 字段:id”。
有趣的是,当我使用 POSTMAN 执行相同的请求(但使用 JSON 而不是二进制负载)时,它起作用了!我在这里做错了什么吗?我认为这肯定是请求的发出方式有问题......
更新:
我使用了本地代理来查看我的应用程序发送的这两个请求的差异,以便了解其中的不同之处。看起来唯一的区别是内容类型。在云模式下,POST 文档的有效负载作为“application/javabin”发送,而在独立模式下,它作为“application/xml; charset=UTF-8”发送。其他一切都一样。第一个请求结果为 400,而第二个请求结果为 200。我认为这可能是 SolrJ/SOLR 错误,因此提交了 ticket for that 。将保持此线程更新。
最佳答案
首先,它在独立模式下工作,因为版本 5.1 中的 HttpSolrClient 以 XML 形式发送有效负载(不包括空值 - 这部分很重要),而 CloudSolrClient 以二进制序列化格式(包含空值)将其作为“application/javabin”发送)。在版本 6.2 中,这两个版本都以二进制序列化格式将有效负载发送为“application/javabin”,因此版本 6.2 中的云模式和独立模式都会出现此问题。
问题的真正原因是为了生成 UUID,该字段必须完全不存在。如果它存在且为空,则跳过 UUID 生成。这就是错误的原因。因此,如果我们使用 SolrInputDocument 来索引我们的文档,那么这很简单 - 我们根本不应该为“id”字段添加值。但是,如果我们使用带有“org.apache.solr.client.solrj.beans.Field”注释的 POJO 会怎么样?我们不能从那里排除一个字段。那就是IgnoreFieldUpdateProcessorFactory发挥作用:
<updateRequestProcessorChain name="uuid">
<!-- Using IgnoreFieldUpdateProcessorFactory because of https://issues.apache.org/jira/browse/SOLR-9493:
can't generate UUID for a field coming as NULL, field must be absent. -->
<processor class="solr.IgnoreFieldUpdateProcessorFactory">
<str name="fieldName">id</str>
</processor>
<processor class="solr.UUIDUpdateProcessorFactory">
<str name="fieldName">id</str>
</processor>
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
将其放在 solrconfig.xml 中并使用“uuid”updateRequestProcessorChain(如上面的问题所示),一切都像魅力一样工作(“id”字段在 UUID 生成之前从文档中删除)。虽然在这种情况下不可能添加具有自定义 ID 的文档,但这仍然是另一个线程的另一个问题。
关于java - uniqueKey 生成在 SolrCloud 中不起作用(但如果独立则可以),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39401792/
我有一个独立的 Solr 具有 4 个不同内核的实例使用嵌入式 Jetty 服务器正常工作。我为 v4.10.3 配置了内核,但自从我迁移到 v5.1 后,一切似乎都运行良好,没有任何更改。 在投入生
在SolrCloud集合API(https://cwiki.apache.org/confluence/display/solr/Collections+API)中,我们可以使用操作列出集合: /ad
我正在开发一个使用 Solr 作为搜索引擎的 .NET 应用程序。我已经用两台服务器(一台用于副本)配置了 SolrCloud 安装,并且我没有将索引拆分为分片(分片数 = 1)。我读过 SolrCl
我是 SolrCloud 新手,我的设置是 3 个分片、3 个副本、外部 Zookeeper 今天我发现 shard3 挂了,replica3 接管了 leader,所以索引发生在 replica3
我正在尝试设置测试 SolrCloud 4.5.1 实现。我的同义词文件大约 1.6 MB。当我尝试在 Ubuntu 12.4 上将集合添加到 ZooKeeper 3.4.5 时,由于 ZooKeep
首先,我创建了一个名为 usercollection 的集合: http://xxxxx/solr/admin/collections?action=CREATE&name=usercollectio
我们有一个 solr 云服务器集群,在我们的压力环境中,每个分片中有 10 个分片和 4 个副本。在我们的 prod 环境中,我们将在每个分片中有 10 个分片和 15 个副本。我们当前的提交设置如下
在 SolrCloud 中调试 Solr 模式和索引时,重要的是要轻松知道文档被索引到哪个分片。是否可以为分片 id 定义架构字段,以便自动分配的分片 id 在搜索结果中可用? 最佳答案 您无需在架构
我正在尝试将标准 4.x Solr 安装升级到 Solr cloud 5.x。我在两者之间进行了一些性能测试并发现了巨大差异。 在同一台服务器上,在不同的时间,我运行了以下命令: Solr 云 5.2
我想为超过 1000 万篇新闻文章建立一个 SolrCloud 集群。看完这篇文章:Shards and Indexing Data in SolrCloud ,我有如下计划: 添加前缀 ED2001
SolrCloud,感谢 ZooKeeper 的集成,为 managing 提供了一些不错的实用程序和 reloading核心/集合配置。 但是,这仅完全涵盖了琐碎更新的情况 - 但也有非平凡更新。在
我一直在尝试实现 SolrCloud,并且一切正常,直到我尝试创建一个包含 6 个分片的集合。我的设置如下: 5 个虚拟服务器,全部运行 Ubuntu 14.04,由一家公司跨不同的数据中心托管 3
我正在学习如何使用 Solrcloud 的新功能,我可以成功地设置一组 Zookeeper 和一组用于分片索引的 Solr 实例。我想调查故障如何影响我的设置。大多数情况下,除了一种情况外,它按预期工
我计划将 Solr 从单实例选项升级到云选项。目前我有 5 个核心,每个核心都配置了数据导入处理程序。我已经在 tomcat 文件夹中部署了 Web 应用程序和 solr.war,它将根据我的项目需求
我有一个带有外部 3 节点 Zookeeper 集成的 5 节点 SolrCloud (Solr 7.0)。有一个名为“production”的集合被分片为 5 个分片,复制因子为 5。请参见下面的屏
我正在尝试在 solrcloud 中创建一个位于 hadoop 集群之上的集合。我们有三个节点 zk ensemble,选择 hdfs 来存储数据/索引。 我浏览了可用的文档,并在集群上的 4 个数据
本周我遇到了 Solr 索引的问题:http://lucene.472066.n3.nabble.com/corrupted-index-in-slave-td4054769.html , 今天,几乎
我正在使用 solr 4.5。经过几次测试后,我注意到很多死的(不存在的)副本在我的 SolrCloud 图表中显示为消失(黑色)。有什么办法可以强制我的 solr 忘记这个消失的副本吗? 我认为
我已经完成了 2 个性能测试来测量 235280 个文档的索引速度: 第一次测试:1 个 solr 实例没有 SolrCloud:索引速度 = 6191 doc/s 第二次测试:4 个 solr 实例
如果我没有可用的智能客户端,我很难准确理解索引和查询的工作原理。我将 SolrNet 与 C# 一起使用,它目前未与 ZooKeeper 集成。 作为一个基本示例,假设我有一个集合,分成两个分片,在两
我是一名优秀的程序员,十分优秀!