你需要的是——我称之为——统一核心。该架构本身将没有内容,它仅用作一种包装器来统一您想要从两个核心显示的那些字段。在那里你需要
- 一个 schema.xml,它包含了您希望在统一结果中包含的所有字段
- 为您组合两个不同核心的查询处理程序
事先取自Solr Wiki 页面上关于 DistributedSearch 的一个重要限制
文档必须具有唯一键并且必须存储唯一键(在 schema.xml 中存储 =“true”)唯一键字段必须在所有分片中都是唯一的。如果遇到具有重复唯一键的文档,Solr 将尝试返回有效结果,但行为可能是不确定的。
例如,我有shard-1的字段 id、title、description 和shard-2的字段 id、title、abstractText。所以我有这些模式
shard-1 的架构
<schema name="shard-1" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="description"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
shard-2 的架构
<schema name="shard-2" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="abstractText"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
为了统一这些模式,我创建了第三个模式,我称之为shard-unification,它包含所有四个字段。
<schema name="shard-unification" version="1.5">
<fields>
<field name="id"
type="int" indexed="true" stored="true" multiValued="false" />
<field name="title"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="abstractText"
type="text" indexed="true" stored="true" multiValued="false" />
<field name="description"
type="text" indexed="true" stored="true" multiValued="false" />
</fields>
<!-- type definition left out, have a look in github -->
</schema>
现在我需要利用这个组合模式,所以我在 solr-unification 核心的 solrconfig.xml 中创建了一个查询处理程序
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="q.alt">*:*</str>
<str name="qf">id title description abstractText</str>
<str name="fl">*,score</str>
<str name="mm">100%</str>
</lst>
</requestHandler>
<queryParser name="edismax" class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />
而已。现在 shard-1 和 shard-2 中需要一些索引数据。要查询统一的结果,只需使用适当的 shards 参数查询 shard-unification。
http://localhost/solr/shard-unification/select?q=*:*&rows=100&start=0&wt=json&shards=localhost/solr/shard-1,localhost/solr/shard-2
这将为您返回一个结果,例如
{
"responseHeader":{
"status":0,
"QTime":10},
"response":{"numFound":2,"start":0,"maxScore":1.0,"docs":[
{
"id":1,
"title":"title 1",
"description":"description 1",
"score":1.0},
{
"id":2,
"title":"title 2",
"abstractText":"abstract 2",
"score":1.0}]
}}
获取文档的原始分片
如果您想将原始分片提取到每个文档中,您只需[shard]
在fl
. 作为查询的参数或在请求处理程序的默认值中,请参见下文。括号是强制性的,它们也将出现在结果响应中。
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true">
<lst name="defaults">
<str name="defType">edismax</str>
<str name="q.alt">*:*</str>
<str name="qf">id title description abstractText</str>
<str name="fl">*,score,[shard]</str>
<str name="mm">100%</str>
</lst>
</requestHandler>
<queryParser name="edismax" class="org.apache.solr.search.ExtendedDismaxQParserPlugin" />
工作样本
如果您想查看运行示例,请查看我在 github 上的solrsample 项目并执行 ShardUnificationTest。我现在还包括了碎片获取。