Was Sie brauchen, ist - was ich nenne - ein Vereinheitlichungskern. Dieses Schema selbst wird keinen Inhalt haben, es wird nur als eine Art Wrapper verwendet, um die Felder zu vereinheitlichen, die von beiden Kernen angezeigt werden sollen. Dort müssen Sie
- ein schema.xml, die alle Felder einpackt, die Sie in Ihrem einheitliches Ergebnis haben wollen
- eine Abfrage-Handler, der die beiden unterschiedlichen Kerne für Sie
vereint eine wichtige Einschränkung zuvor aus the Solr Wiki page about DistributedSearch
genommen
Dokumenten einen eindeutigen Schlüssel und die eindeutigen Schlüssel haben müssen muss gespeichert (in schema.xml gespeichert = „true“) das einzigartige Schlüsselfeld uniqu sein muß e über alle Scherben. Wenn Dokumente mit doppelten eindeutigen Schlüsseln gefunden werden, versucht Solr, gültige Ergebnisse zurückzugeben, aber das Verhalten ist möglicherweise nicht deterministisch.
Als Beispiel habe ich Scherbe-1 mit der Felder ID, Titel, Beschreibung und Scherbe-2 mit der Felder ID, Titel, abstractText. Also ich habe dieses Schema
Schema von 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>
Schema von 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>
diese Schemata mir ein drittes Schema erstellen zu vereinigen, die ich nennen shard-unification, die alle vier Felder enthält.
<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>
Jetzt muss ich Verwendung dieses kombinierten Schema machen, so dass ich eine Abfrage erstellen Handler in der solrconfig.xml der solr-Vereinigung Kern
<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" />
Das ist es. Jetzt sind einige Indexdaten in shard-1 und shard-2 erforderlich. Um nach einem einheitlichen Ergebnis zu fragen, fragen Sie einfach die Shard-Vereinheitlichung mit dem entsprechenden Shards-Parameter ab.
http://localhost/solr/shard-unification/select?q=*:*&rows=100&start=0&wt=json&shards=localhost/solr/shard-1,localhost/solr/shard-2
Dieses Sie wie ein Ergebnis kehrt
{
"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}]
}}
Fetch den Ursprung Scherbe eines Dokuments
Wenn Sie den Ursprung Scherbe in jedem Dokument holen wollen, müssen Sie nur [shard]
angeben innerhalb fl
. Entweder als Parameter mit der Abfrage oder in den Standardeinstellungen des Requesthandlers, siehe unten. Die Klammern sind obligatorisch, sie werden auch in der resultierenden Antwort enthalten sein.
<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" />
Beispielarbeits
Wenn Sie ein laufendes Beispiel sehen möchten, Kasse my solrsample project auf Github und execute the ShardUnificationTest. Ich habe jetzt auch das Shard-Holen mit einbezogen.
Meinten Sie „b“ mehr Spalten als „a“? Wenn die Spalten von "b" eine Untermenge von denen in "a" sind - wie ich Ihre Frage verstehe - verstehe ich das Problem hier nicht. –