2016-11-21 2 views
0

Ich habe ein Dokument, das Arrays von verschachtelten Dokumenten enthält. Ich habe die Anforderung, Übereinstimmungen zurückzugeben, wenn das Dokument alle angegebenen verschachtelten Dokumente enthält.Match-Dokument, wenn es mehrere verschachtelte Dokumente in elasticsearch enthält

hier ist der relevante Teil der Abbildung:

"element": { 
    "dynamic": "false", 
    "properties": { 
    "tenantId": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "fqn": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "id": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "name": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "type": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "location": { 
     "type": "string", 
     "index": "not_analyzed" 
    }, 
    "tags": { 
     "type": "nested", 
     "properties": { 
     "id": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "dataSourceId": { 
      "type": "long", 
      "index": "not_analyzed" 
     }, 
     "name": { 
      "type": "string", 
      "index": "not_analyzed" 
     }, 
     "value": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    } 
} 

Das Ziel ist es, Elemente zurück, die alle aus einer Liste von Tags enthalten (obwohl das Element erlaubt ist, zusätzliche Tags über die Suche enthalten Anforderung). Hier

ist das, was ich bisher:

{ 
    "query": { 
    "bool": { 
     "filter": { 
      "nested": { 
      "path": "tags", 
      "query": { 
       "bool": { 
        "must": [ 
         { 
         "bool": { 
          "must":{ 
          "term": { "tags.name": "name1" }, 
          "term": { "tags.value": "value1" } 
          } 
         } 
         }, 
         { 
         "bool": { 
          "must":{ 
          "term": { "tags.name": "name2" }, 
          "term": { "tags.value": "value2" } 
          } 
         } 
         } 
        ] 
       } 
      } 
      } 
     } 
    } 
    } 
} 

Das Problem bei diesem Ansatz ist, dass es gibt 0 Treffer mit mehreren Variablenwerten (es funktioniert gut für einen einzelnen Wert). Ich glaube, dass dies daran liegt, dass die Abfrage erfordert, dass ein Tag mehrere Namen und Werte hat, um zu passen, was offensichtlich nicht passieren kann. Kann jemand nach Elementen fragen, die alle eine Liste der Umbauten enthalten?

edit: dies ist Elasticsearch 5.0

+0

Versuchen Sie dies zu tun? https://www.elastic.co/guide/en/elasticsearch/guide/master/_finding_multiple_exact_values.html – JamesKn

+0

@JamesKn Ich schaute in Begriffe Abfragen, aber es ist mein Verständnis, dass sie eine implizite "oder" Operation auf die Werte sind . Ich brauche eine "und" -Operation. –

Antwort

2

mit dachten wir es aus. Die Antwort bestand darin, zwei verschachtelte Abfragen zu erstellen, anstatt zwei Klauseln für dieselbe verschachtelte Abfrage zu verwenden.

{ 
"query":{ 
    "bool":{ 
    "must":[{ 
     "nested":{ 
      "path":"tags", 
      "query":{ 
       "bool":{ 
       "must":[ 
        {"term":{"tags.name":"name1"}}, 
        {"term":{"tags.value":"value1"}} 
       ] 
       } 
      } 
     } 
    }, 
    { 
     "nested":{ 
      "path":"tags", 
      "query":{ 
       "bool":{ 
       "must":[ 
        {"term":{"tags.name":"name2"}}, 
        {"term":{"tags.value":"value2"}} 
       ] 
       } 
      } 
     } 
    }] 
    } 
} 
} 
+0

Kam gegen dieses Problem und Ihre Antwort hat mir eine Menge Kopfschmerzen erspart, danke! – BenM

Verwandte Themen