2016-07-20 13 views
0

Beachten Sie, dass ich ein kompletter Neuling mit ElasticSearch bin und ich bin auf einer Zeitkrise. Ich habe die folgende Anfrage:ElasticSearch - Single-Match zu mehreren

Derzeit unterstützt die Codebasis nur die Suche nach Elementen mit einem bestimmten Zustand. Ich versuche es zu ändern, um eine Liste möglicher Statuswerte zu unterstützen. Jetzt habe ich gesehen, wo man should und terms verwenden kann, aber die Ergebnisse für beide sind leere Datensätze.

Ich habe versucht, dies zu suchen, aber Beispiele, die ich gesehen habe, funktionieren entweder nicht oder haben sehr schlecht (wenn überhaupt) Lösungen erklärt, oder hängen davon ab, Seiten der Dokumentation zu lesen und zu absorbieren (für die ich einfach tue) habe nicht die Zeit). Wie würde ich die oberste Abfrage ändern, um nach mehreren Werten zu suchen?

aktualisieren

Lauf folgendes:

curl -XGET localhost:9200/listings/_mapping/listing/field/state?pretty 

ich diese Zuordnung erworben haben:

{ 
    "listings" : { 
    "mappings" : { 
     "listing" : { 
     "state" : { 
      "full_name" : "state", 
      "mapping" : { 
      "state" : { 
       "type" : "string" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Update 2

I-Update haben d das Mapping, um es auf not_analyzed zu setzen und die Option store zu aktivieren. Daten wurden erneut importiert. Die neue Anfrage sieht so aus:

{ 
    "query":{ 
     "filtered":{ 
      "filter":{ 
       "and":[ 
        { 
         "bool":{ 
          "should":[ 
           { 
            "terms":{ 
             "state":["VA","MD"] 
            } 
           } 
          ] 
         } 
        },{ 
         "bool":{ 
          "must":[ 
           { 
            "match":{ 
             "status":"Active" 
            } 
           } 
          ] 
         } 
        } 
       ] 
      } 
     } 
    }, 
    "sort":["dom"], 
    "size":1 
} 
+1

Was ist das Mapping für das Feld 'state' und liefert eine Datenprobe dessen, was in dieses Feld gelangt. –

+0

Es ist eine Zeichenfolge (zwei Zeichen, Großbuchstaben) und scheinbar "analysiert". Ich habe versucht, eine Anweisung auszuführen, um es in 'not_analyzed' zu ändern, aber es beschwert sich, dass der Index bereits existiert. –

+0

Ja, wenn Sie die Zuordnung ändern möchten, müssen Sie den Index neu erstellen. Und Sie haben das Mapping noch nicht bereitgestellt :-) und ein Beispieldokument. –

Antwort

0

Haben Sie versucht, die innere "Abfrage" für Ihre "reverse engineered" Abfrage zu ersetzen?

Etwas wie folgt aus:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "state": "VA" 
       } 
      }, 
      { 
       "match": { 
       "state": "MD" 
       } 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "bool": { 
       "must": [ 
       { 
        "match": { 
        "status": "Active" 
        } 
       } 
       ] 
      } 
      } 
     ] 
     } 
    } 
    }, 
    "sort": [ 
    "dom" 
    ], 
    "size": 1 
} 

By the way, diese Abfrage ist ein bisschen chaotisch. Sie könnten es rekonstruieren, indem Sie die "Muss" - und "Soll" -Klauseln unter einem einzigen "Bool" kombinieren. Sie könnten dann die "gefilterte" Abfrage verwerfen und das einzelne "bool" direkt unter dem root-Tag "query" verwenden oder den Abschnitt "query" von "filtered" verwerfen und nur den "filter" -Teil verwenden.

+0

Ich habe das auch versucht, und es gab keine Ergebnismenge zurück. –

Verwandte Themen