鉴于以下(单核)查询:
http://localhost/solr/a/select?indent=true&q=*:*&rows=100&start=0&wt=json
http://localhost/solr/b/select?indent=true&q=*:*&rows=100&start=0&wt=json
第一个查询返回" numFound":40000" 第二个查询返回" numFound":10000"
我尝试将这些放在一起:
http://localhost/solr/a/select?indent=true&shards=localhost/solr/a,localhost/solr/b&q=*:*&rows=100&start=0&wt=json
现在我得到" numFound":50000"。 唯一的问题是" a"列数多于" b"。因此,多个集合请求仅返回a的值。
是否可以使用不同的字段查询多个集合?或者他们必须是一样的吗?我应该如何更改我的第三个网址以获得此结果?
答案 0 :(得分:22)
您需要的是 - 我称之为 - 统一核心。该模式本身不具有任何内容,它仅用作一种包装器来统一您希望从两个核心显示的那些字段。在那里你需要
预先从the Solr Wiki page about 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中需要一些索引数据。要查询统一结果,只需使用适当的分片参数查询分片统一。
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的默认值中,请参阅下文。括号是强制性的,它们也将在最终的响应中。
<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和my solrsample project上结帐execute the ShardUnificationTest。我现在还包括了碎片。
答案 1 :(得分:1)
Sharr应该在Solr中使用
当索引变得太大而无法放在单个系统上时,或者单个查询执行时间太长时
因此列的数量和名称应始终相同。这在本文档中指定(前面的引用也来自): http://wiki.apache.org/solr/DistributedSearch
如果您保持查询不变,并使两个分片具有相同的字段,则该shoudl将按预期工作。
如果您想了解更多关于分片如何在SolrCould中工作的信息,请查看此docuemtn: http://wiki.apache.org/solr/SolrCloud