2017-11-24 4 views
1

Ich benutze Mango-Abfragen mit Couchdb, wenn Benutzer die Datenbank durchsuchen möchten. Sie können nach mehreren Feldern im Dokument suchen.Couchdb, Mango Abfragen und Indizes

Zur Vereinfachung habe ich ein Dokument mit drei Feldern, die alle durchsucht werden können, um das Dokument zu finden.

FieldOne: cow 
FieldTwo: pig 
FieldThree: dog 

Beim Erstellen eines Mango-Index für die Abfrage, welche Felder soll ich verwenden? Soll ich mit mehreren Feldern erstellen und indexieren? Ist die Bestellung wichtig?

In einem Feld sind auch drei verschiedene Dokumenttypen (A, B C) definiert. Ich muss nur eines suchen, ist es möglich, die anderen Typen vom Index auszuschließen, um es schneller zu machen?

Field_Type: A 

Es würde Sinn für mich in der Lage sein, einen Index für eine Sicht nur die Suche durch die Dokumente laufen ich interessiert bin. Ist das möglich?

Beispiel Indizes

Ein Index auf dem Feld in der Abfrage

{ 
     "index": { 
      "fields": [ 
      "FieldOne" 
      ] 
     }, 
     "name": "foo-json-index", 
     "type": "json" 
    } 

Mehrere Indizes erscheinen bekannt ist, nicht sicher, ob benutzt oder nicht?

{ 
     "index": { 
      "fields": [ 
      "FieldOne", 
      "FieldTwo", 
      "FieldThree" 
      ] 
     }, 
     "name": "foo-json-index", 
     "type": "json" 
    } 

Oder mehrere Indizes, um beim Erstellen der Abfrage die richtige auszuwählen?

Welches ist der richtige Ansatz, um die schnellsten Suchergebnisse zu erhalten?

+0

Haben Sie ein Beispiel für die Abfrageauswahl (en), die Sie optimieren möchten. Es ist schwierig, einen Index vorzuschlagen, der beliebige Abfragen über mehrere Felder abdeckt, aber wenn Sie eine bestimmte Abfrage zur Optimierung haben, kann ich Sie vielleicht beraten. –

+0

Die Abfrage ist sehr variabel über mehrere Felder, sie wird von Backoffice-Mitarbeitern verwendet, daher glaube ich nicht, dass sie leicht optimiert werden kann, da sie nach allem zu suchen scheinen. Danke für dein Angebot und die Antwort hat mir viele Fragen in den Kopf gesetzt. @WillHolley –

Antwort

3

Ich glaube nicht, dass Sie dies im allgemeinen Fall leicht lösen können - Sie müssten einen bestimmten Selektor (oder einen Satz von Selektoren) für die Optimierung benötigen. Allerdings gibt es drei Aspekte zu berücksichtigen, wenn das Erstellen eines Index, die helfen können:

  1. Wenn Sie einen Mango-Index erstellen, werden nur Dokumente alle der indizierten Felder enthalten, werden in den Index aufgenommen. Das zweite Indexbeispiel, das Sie angeben und das alle 3 Felder enthält, ist völlig in Ordnung, solange Sie immer alle 3 Felder in der Abfrageauswahl angeben.

  2. Zum Abfragezeitpunkt kann ein Index nur verwendet werden, wenn alle indizierten Felder entsprechend dem Selektor vorhanden sein müssen. Wenn Ihr Index beispielsweise die Felder A und B enthält, Sie aber nur nach A suchen, können wir den Index nicht verwenden, da er keine Dokumente enthält, die A, aber nicht die Reihenfolge der Felder im Index enthalten Angelegenheiten. Ein Index kann nur verwendet werden, wenn er einen zusammenhängenden Wertebereich für die indizierten Felder finden kann - genau wie ein zusammengesetzter Schlüssel für eine _view. Angenommen, Sie haben einen Index für die Felder A und B und die Dokumente [{A:1,B:1},{A:1,B:2},{A:2,B:1},{A:2,B:2}]. Der Index sieht wie folgt aus: [[1,1],[1,2],[2,1],[2,2]]. Wenn Ihre Abfrage dann A > 1 AND B == 2 ist, die übereinstimmenden Dokumente ([1,2] und [2,2]) der einzige Bereich, der alle übereinstimmenden Dokumente abdeckt, ist [1,2],[2,1],[2,2]] - der Wert [2,1] müsste im Speicher ausgefiltert werden.

Sie können sehen, welcher Index eine Abfrage mit dem _explain Endpunkt zu erfüllen verwendet wird, und das sollte man einen Hinweis geben, wie selektiv der Index für einen bestimmten Selektor sein kann.

Verwandte Themen