使用Solr 6.3.0
,在云模式下,将3个外部zookeepers
作为群集,并使用solrJ
作为客户端。
在启用authentication
之前,我使用以下代码添加/更新文档:
CloudSolrClient client = cloudClientBuilder.build();
UpdateResponse resp = client.add(doc, 5000);
client.commit();
client.close();
return resp;
效果很好,新文档立即搜索结果。
然后我启用了basic authentication plugin
和rule-based authorization plugin
(以及SSL
,如果这很重要的话。)
要设置凭据信息,代码将重构如下:
// create request,
UpdateRequest req = new UpdateRequest();
// add doc to request,
req.add(doc, 5000);
// set credential,
req.setBasicAuthCredentials(user, password);
// create client,
CloudSolrClient client = cloudClientBuilder.build();
client.setDefaultCollection(ConfigUtil.getProp(ConfigUtil.KEY_SOLR_CORE));
// do request & get response,
UpdateResponse resp = req.process(client);
client.commit();
client.close();
然后它会得到类似的错误:
错误401需要身份验证,需要身份验证。
调试时,错误发生在第client.commit();
行。
尝试使用curl
我使用curl
进行更新:
curl -k --user solr:password“https://localhost:8983/solr/corexxx/update?wt=json&indent=true&commit=true” - d'[{“id”:“20041”,“name”:“xxx 41”,“location”:“xxx”,“描述 “:” XXX“}]'
它成功了!并且,更新在搜索结果中立即可见。
我的猜测
由于curl
效果很好,我猜solr cloud本身运行正常。
因此问题是由 B 的代码引起的,该代码基于SolrJ。
问题:
HTTP 401
错误?我该如何解决?感谢。
答案 0 :(得分:2)
您应该更改client.commit()
的{{1}},凭据在UpdateRequest中设置。
答案 1 :(得分:0)
它的工作原理如下:
SolrClient client = new HttpSolrClient.Builder(urlString).build();
UpdateRequest up = new UpdateRequest();
up.setBasicAuthCredentials(user, pass);
up.add(doc1);
up.process(client, core);
up.commit(client, core);
client.close();