2016-04-28 1 views
1

Gegeben:Wie kann ein Feld aus einem bestimmten Dokumententyp in Abfragen oder Filtern in Elasticsearch angegeben oder ausgewählt werden?

  1. Dokumente von zwei verschiedenen Arten, sagen sie, ‚Produkt‘ und ‚Kategorie‘, den Index gleichen Elasticsearch indiziert sind.
  2. Beide Dokumenttypen haben ein Feld 'Tags'.

Problem:

Ich möchte eine Abfrage erstellen, die Ergebnisse beider Typen zurückgibt, aber die Dokumente vom Typ ‚Produkt‘ sind erlaubt Tags ‚X‘ haben und ‚Y‘, und die Dokumente vom Typ "Kategorie" dürfen nur das Tag "Z" haben. Wie kann ich das erreichen? Es scheint, dass ich product.tags und category.tags nicht verwenden kann, da ES dann nach dem Produkt/Kategorie-Feld von Dokumenten sucht, was nicht meine Absicht ist.

Hinweis:

Während für das obige Beispiel könnte es eine Art von Problem zu umgehen sein, ich bin für eine allgemeine Art und Weise suchen Felder eines bestimmten Dokumententyp zu zielen oder geben Sie bei Anfragen zu schreiben. Ich möchte im Grunde die in meiner Abfrage verwendeten Feldnamen 'namespace' nennen, so dass nur Dokumente des Typs berücksichtigt werden, mit denen ich arbeiten möchte.

Antwort

1

Ich denke, Feld Aliasing wäre die beste Antwort für Sie, aber es ist nicht möglich. Stattdessen können Sie „copy_to“ aber ich es wirkt wahrscheinlich Indexgröße:

DELETE /test 
PUT /test 
{ 
     "mappings": { 
      "product" : { 
       "properties": { 
       "tags": { "type": "string", "copy_to": "ptags" }, 
       "ptags": { "type": "string" } 
      } 
      }, 
      "category" : { 
       "properties": { 
       "tags": { "type": "string", "copy_to": "ctags" }, 
       "ctags": { "type": "string" } 
      } 
     } 
    } 
} 

PUT /test/product/1 
{ "tags":"X" } 
PUT /test/product/2 
{ "tags":"Y" } 
PUT /test/category/1 
{ "tags":"Z" } 

Und Sie können eines der Felder abfragen oder viele von ihnen:

GET /test/product,category/_search 
{ 
    "query": { 
     "term": { 
      "ptags": { 
       "value": "x" 
      } 
     } 
    } 
} 

GET /test/product,category/_search 
{ 
    "query": { 
     "multi_match": { 
     "query":  "x", 
     "fields":  [ "ctags", "ptags" ] 
     } 
    } 
} 
+0

Vielen Dank für Ihre Antwort, aber das Problem ist, dass in Ihrem ersten Beispiel "product.tags" und "category.tags" zu versuchen scheinen, in jedem Kandidatendokument ein Feld .product.tags und .category.tags anstelle der Feldtags in Dokumenten vom Typ product/zu finden. category ... – Asciiom

+0

IMHO ist es egal, wenn ES intern "product.tags" in jedem Dokument und "category.tags" in jedem Dokument sucht. Das Ergebnis ist in Ordnung. Ich denke, dass das zweite Beispiel dem ersten gleich ist und dasselbe funktioniert, aber ich habe keine Kenntnis von der internen Implementierung von ES. Ist es möglich, dass ich Ihre Absicht nicht genau verstehe? –

+1

Das ist möglich, wenn Sie zwei Dokumenttypen haben, die ein Feld mit demselben Namen enthalten und Sie (aus welchen Gründen auch immer) in einer Abfrage abhängig vom Dokumenttyp, zu dem das Feld gehört, verwenden müssen eine Möglichkeit, zwischen den beiden zu unterscheiden. Und der offensichtliche Ansatz, die Punktnotation zu verwenden, scheint nicht zu funktionieren. – Asciiom

Verwandte Themen