3

我在实例上有几个 Solr 核心,每个核心都配置了一个StandardRequestHandler和一些自定义请求处理程序,例如:

<requestDispatcher handleSelect="true" >
  <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
</requestDispatcher>
...
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
...
<requestHandler name="/custom" class="com.example.our.package.CustomHandler" />
...

我希望能够通过 SolrJ 访问它们,但是,我只能通过设置对象的baseUrl属性来做到这一点HttpSolrServer。然而,这是不可取的,因为实例是在多个线程之间共享HttpSolrServer,所以会出现竞争条件。另一个原因是团队的共识在于为简单起见HttpSolrServer进行Singleton范围划分。

我尝试的是这样的:

HttpSolrServer server = new HttpSolrServer("http://URL_OF_SOLR:PORT/solr/");
SolrQuery query = new SolrQuery();
query.setQueryType("/core/custom");

这适用于自定义处理程序,但是在调用时它会失败并显示代码 400 /select,至少对于我尝试过的 URL(/core、、、、/core/select/core//core/standard

所以我的问题是:我应该如何定义这个查询以正确引用核心的默认请求处理程序,只使用queryType或其他一些SolrParams值?

4

1 回答 1

3

您可以使用qtSolr 中的参数来指定特定的请求处理程序,甚至是默认/select处理程序。有关其工作原理的详细信息,请参阅CoreQueryParameters。SolrJ 通过使用类上的setRequestHandler方法来支持这一点SolrQuery

一些示例,假设您的 Solr 实例位于http://localhost:8983/solr并且您有两个名为core0和的核心core1

  • http://localhost:8983/solr/core0/select?q=*:*/select默认使用
  • http://localhost:8983/sole/core1/select?q=*:*&qt=terms这使用术语 requestHandler

最后,核心名称不应包含在qt参数 b/c 中,该参数旨在支持在核心中选择命名的 requestHandler。Solr 实例的 Url 应该在其中包含核心名称,因为每个核心都是它自己的 Solr 实例,因此应该被视为 IMO。从 SolrCore 维基页面:

多核让您拥有一个具有单独配置和索引的 Solr 实例,具有针对非常不同的应用程序的自己的配置和架构,但仍然具有统一管理的便利。

所以定义多个 HttpSolrServer 实例。

 new HttpSolrServer(http://localhost:8983/solr/core0)
 new HttpSolrServer(http://localhost:8983/solr/core1)
于 2013-06-10T14:44:31.963 回答