我在实例上有几个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");
这适用于自定义处理程序,但在调用/select
时失败,代码为400,至少对于我尝试过的网址/core
,/core/select
,/core/
, /core/standard
)等。
所以我的问题是:如何定义此查询以正确引用核心的默认请求处理程序,仅使用queryType
或其他SolrParams
值?
答案 0 :(得分:3)
您可以使用Solr中的qt
参数指定特定的请求处理程序,甚至是默认的/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)