2013-07-30 13 views
6

Ich bin ziemlich neu in ES und verwende es für ein neues Projekt von mir. Zu Beginn habe ich eine einfache Zuordnung für einen Kunden, der einen Vor- und Nachnamen und eine Liste von Zahlungsinformationsobjekten hat. Wenn ich dies in SQL tun würde, wäre es etwas wie eine Kundentabelle und eine Zahlungsinformationstabelle mit einer 1: Viele-Beziehung.ElasticSearch: Suche nach Feldern in verschachtelten Arrays

Hier ist ein einfaches Beispiel dafür, was ich versuche zu tun:, dh das Auffinden alle Benutzer in der verschachtelten Anordnung von paymentInfos basierend auf einem Spiel https://gist.github.com/anonymous/6109593

jeden Kunden zu finden, ich bin der Hoffnung, die eine gehabt haben paymentInfo mit billingZip 10101. Diese Abfrage gibt keine Ergebnisse zurück, und ich weiß nicht warum. Kann mir jemand in die richtige Richtung zeigen, warum diese Abfrage nicht funktioniert, und ob es irgendwelche Änderungen gibt, die ich entweder an meiner Abfrage oder an meinem Mapping vornehmen kann, um den Benutzer korrekt zurückgeben zu lassen?

Danke!

Antwort

9

Verschachtelte Felder sollten mit nested query gesucht werden:

echo "Deleting old ElasticSearch index..." 
curl -XDELETE 'localhost:9200/arrtest' 
echo 
echo "Creating new ElasticSearch index..." 
curl -XPUT 'localhost:9200/arrtest/?pretty=1' -d '{ 
    "mappings" : { 
     "cust2" : { 
     "properties" : { 
      "firstName" : { 
       "type" : "string", 
       "analyzer" : "string_lowercase" 
      }, 
      "lastName" : { 
       "type" : "string", 
       "analyzer" : "string_lowercase" 
      }, 
      "paymentInfos": { 
       "properties": { 
        "billingZip": { 
         "type": "string", 
         "analyzer": "string_lowercase" 
        }, 
        "paypalEmail": { 
         "type": "string", 
         "analyzer": "string_lowercase" 
        } 
       }, 
       "type": "nested" 
      } 
     } 
     } 
    }, 

    "settings" : { 
     "analysis" : { 
     "analyzer" : { 
      "uax_url_email" : { 
       "filter" : [ "standard", "lowercase" ], 
       "tokenizer" : "uax_url_email" 
      }, 

      "string_lowercase": { 
       "tokenizer" : "keyword", 
       "filter" : "lowercase" 
      } 
     } 
     } 
    } 
} 
' 
echo 
echo "Index recreation finished" 

echo "Inserting one record..." 
curl -XPUT 'localhost:9200/arrtest/cust2/1' -d '{ 
    "firstName": "john", 
    "lastName": "smith", 

    "paymentInfos": [{ 
     "billingZip": "10101", 
     "paypalEmail": "[email protected]" 
    }, { 
     "billingZip": "20202", 
     "paypalEmail": "[email protected]" 
    }] 
} 
' 
echo 
echo "Refreshing index to make new records searchable" 
curl -XPOST 'localhost:9200/arrtest/_refresh' 
echo 
echo "Searching for record..." 
curl -XGET 'localhost:9200/arrtest/cust2/_search?pretty=1' -d '{ 
    "sort": [], 
    "query": { 
     "bool": { 
      "should": [], 
      "must_not": [], 
      "must": [{ 
       "nested": { 
        "query": { 
         "query_string": { 
          "fields": ["paymentInfos.billingZip"], 
          "query": "10101" 
         } 
        }, 
        "path": "paymentInfos" 
       } 
      }] 
     } 
    }, 
    "facets": {}, 
    "from": 0, 
    "size": 25 
}' 
echo 
+0

warum paymentInfos mit billingzip "20202" zurückkehrt, ist das normal? –

+0

@OrhanCinar, was Sie zurück erhalten, ist die Quelle des ursprünglichen Datensatzes, der alle verschachtelten Felder enthält. – imotov

+0

kann ich nur das Kind mit Zip 10101 filtern, brauche ich nur einen Datensatz der verschachtelten Felder. Ist das möglich ? –

Verwandte Themen