2016-06-23 18 views
0

Ich versuche, die ElasticSearch Abfragesprache zu knacken, und bis jetzt bin ich nicht sehr gut.ElasticSearch Abfrage auf Tags

Ich habe die folgende Zuordnung für meine Dokumente.

{ 
    "mappings": { 
     "jsondoc": { 
      "properties": { 
       "header" : { 
        "type" : "nested", 
        "properties" : { 
         "plainText" : { "type" : "string" }, 
         "title" : { "type" : "string" }, 
         "year" : { "type" : "string" }, 
         "pages" : { "type" : "string" } 
        } 
       }, 
       "sentences": { 
        "type": "nested", 
        "properties": { 
         "id": { "type": "integer" }, 
         "text": { "type": "string" }, 
         "tokens": { "type": "nested" }, 
         "rhetoricalClass": { "type": "string" }, 
         "babelSynsetsOcc": { 
          "type": "nested", 
          "properties" : { 
           "id" : { "type" : "integer" }, 
           "text" : { "type" : "string" }, 
           "synsetID" : { "type" : "string" } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Es ähnelt hauptsächlich einer JSON-Datei, die sich auf ein PDF-Dokument bezieht.

Ich habe versucht, Abfragen mit Aggregationen zu machen und bis jetzt läuft es super. Ich bin zu dem Punkt der Gruppierung durch (Aggregation) rhetoricalClass gekommen, um die Gesamtzahl der Wiederholungen von babelSynsetsOcc.synsetID zu erhalten. Heck, sogar die gleiche Frage, sogar durch die Gruppierung des gesamten Ergebnisses durch header.year

Aber gerade jetzt, ich kämpfe mit dem Filtern der Dokumente, die einen Begriff enthalten und die gleiche Abfrage tun.

Also, wie könnte ich eine Abfrage machen, so dass Gruppierung von rhetoricalClass und nur die Berücksichtigung der Dokumente, deren Feld header.plainText entweder ["Computational", "Compositional", "Semantics"] enthält. Ich meine contain statt equal!.

Wenn ich eine grobe Übersetzung machen es ähnlich, etwas zu SQL

SELECT count(sentences.babelSynsetsOcc.synsetID) 
FROM jsondoc 
WHERE header.plainText like '%Computational%' OR header.plainText like '%Compositional%' OR header.plainText like '%Sematics%' 
GROUP BY sentences.rhetoricalClass 

Antwort

1

WHERE Klauseln sind nur Standard strukturierte Abfragen würden, so dass sie auf Anfragen in Elasticsearch übersetzen.

GROUP BY und HAVING locker in Aggregationen in Elasticsearch DSL zu übersetzen. Funktionen wie count, minmax und sum sind eine Funktion von GROUP BY und es ist daher auch eine Aggregation.

Die Tatsache, dass Sie nested Objekte verwenden, kann notwendig sein, aber es fügt jedem Teil, der sie berührt, eine zusätzliche Ebene hinzu. Wenn diese nested Objekte nicht Arrays sind, dann verwenden Sie nicht nested; Verwenden Sie in diesem Fall object.

ich wahrscheinlich zu übersetzen Ihre Abfrage aussehen:

{ 
    "query": { 
    "nested": { 
     "path": "header", 
     "query": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "header.plainText" : "Computational" 
       } 
      }, 
      { 
       "match": { 
       "header.plainText" : "Compositional" 
       } 
      }, 
      { 
       "match": { 
       "header.plainText" : "Semantics" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Alternativ könnte es als diese neu geschrieben werden, was etwas weniger offensichtlich seine Absicht ist:

{ 
    "query": { 
    "nested": { 
     "path": "header", 
     "query": { 
     "match": { 
      "header.plainText": "Computational Compositional Semantics" 
     } 
     } 
    } 
    } 
} 

Die Aggregation würde dann sein:

Jetzt, wenn Sie sie kombinieren und Hits wegwerfen ust für das aggregierte Ergebnis) suchen, dann sieht es wie folgt aus:

{ 
    "size": 0, 
    "query": { 
    "nested": { 
     "path": "header", 
     "query": { 
     "match": { 
      "header.plainText": "Computational Compositional Semantics" 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "nested_sentences": { 
     "nested": { 
     "path": "sentences" 
     }, 
     "group_by_rhetorical_class": { 
     "terms": { 
      "field": "sentences.rhetoricalClass", 
      "size": 10 
     }, 
     "aggs": { 
      "nested_babel": { 
      "path": "sentences.babelSynsetsOcc" 
      }, 
      "aggs": { 
      "count_synset_id": { 
       "count": { 
       "field": "sentences.babelSynsetsOcc.synsetID" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Ja, Sie haben völlig recht, ich sollte mehr Mühe geben die Dokumentation zu lesen, aber es ist so eine schmerzhafte Arbeit ihrer offiziellen doc zu lesen. Das einzige, was in meinen Abfragen fehlte, war der verschachtelte Filter, ich weiß nicht, wie ich das übersehen hätte. Wie auch immer, vielen Dank für Ihren Beitrag – Mayhem