2013-10-11 5 views
11

mit der folgenden (Single-Core) Abfrage:Abfrage mehr Sammlungen mit verschiedenen Bereichen in solr

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 

Die erste Abfrage gibt "numFound": 40000" Die zweite Abfrage gibt "numFound": 10000"

ich habe versucht, diese zusammen, indem sie:

http://localhost/solr/a/select?indent=true&shards=localhost/solr/a,localhost/solr/b&q=*:*&rows=100&start=0&wt=json 

Jetzt bekommen „numFound“ ich:. Das einzige Problem ist ‚50000" ein‘ mehr Spalten als hat " b ". Daher gibt die Anforderung für mehrere Sammlungen nur die Werte von a zurück.

Ist es möglich, mehrere Sammlungen mit verschiedenen Feldern abzufragen? Oder müssen sie gleich sein? Und wie sollte ich meine dritte URL ändern, um dieses Ergebnis zu erhalten?

+0

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. –

Antwort

20

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.

+0

Woher weißt du, welche ID (aus welchem ​​Shard) zurückgegeben wird? – Vincent

+0

@Vincent Ich habe einen Absatz darüber eingefügt, Sie können die URLs des Shards abrufen. Das sollte dem Zweck dienen. – cheffe

+0

Jetzt habe ich Daten wie folgt: "shard-1 {id: '1'; titel: 'test1', beschreibung: 'test1Des'}, shard-2 {id: '1'; titel: 'test2', abstractText: "test2Des"}; URL: http: // localhost/solr/shard-vereinheitlichung/select? q = id: 1 & rows = 100 & start = 0 & wt = json & shards = localhost/solr/shard-1, localhost/solr/shard-2 das Ergebnis zusammenzuführen? –

1

Shards sollte in Solr

verwendet werden, wenn ein Index auf einem einzigen System passen zu groß wird, oder wenn eine einzelne Abfrage zu lange dauert

so die Anzahl und Namen auszuführen der Spalten sollten immer gleich sein. Dies wird in diesem Dokument (wo das vorherige Zitat aus auch kommen): http://wiki.apache.org/solr/DistributedSearch

Wenn Sie Ihre Abfrage lassen, wie es ist, und machen die beiden Scherben mit den gleichen Feldern dieses shoudl nur wie erwartet.

Wenn Sie weitere Informationen über wollen, wie die Scherben arbeiten in SolrCould haben einen Blick auf diese docuemtn auch: http://wiki.apache.org/solr/SolrCloud

+0

Wenn alle Shards zur selben Sammlung gehören, sind Sie richtig. Und tatsächlich gibt es * immer * dieselben Spalten in derselben Sammlung, weil Spalten im Schema definiert sind, das zur Sammlung gehört. Die Frage ist jedoch, wie "mehrere Sammlungen abgefragt werden". Und in verschiedenen Sammlungen können Sie verschiedene Spalten haben. –

Verwandte Themen