2016-09-21 1 views
0

Ich suche durch Protokolle mit Platzhaltern auf mehrere Felder, diese Platzhalter Abfragen sind in einer Klasse sollte jedes Protokoll neben den Feldern, die ich mit Platzhaltern suchen, hat eine "action_id" -Feld, ich Ich möchte nur die Protokolle zurückgeben, die mit einem oder mehreren Platzhaltern übereinstimmen, und mindestens eine der action_ids haben, die ich haben möchte (im Beispiel A oder B).Elastische Suche, mit sollte innerhalb sollte

Was nicht funktioniert:

q={ 
     "size" : 20, 
     "sort" : [ 
      { "clsfd_id" : {"order" : "asc"}}, 
     ], 
     "fields": 
     "query":{ 
      "filtered":{ 
       "query":{ 
       "match_all":{ 

       } 
       }, 
       "filter":{ 
       "bool":{ 
        "should":[ 
         { 
          "query":{ 
          "term":{ 
           "id":"*12*" 
          } 
          }}     #gets filled dynamically with wildcard queries 
         ], 
         "should":[ 
          {"query":{ 
          "term":{ 
           "action_id":"A" 
          } 
          } 
          }, 
          {"query":{ 
          "term":{ 
           "action_id":"B" 
          } 
          } 
          }, 
       ] 
       } 
      } 
     } 
     } 
    } 

Beispiel doc:

{ 
    "_index": "logs", 
    "_type": "log", 
    "_id": "AVdPQBuRkYFjD-WA9CiE", 
    "_score": null, 
    "_source": { 
    "username": "Ιδιώτης", 
    "user_id": null, 
    "action_on": "Part", 
    "ip": "sensitive info", 
    "idents": [ 
     "sensiti", 
     "sensitive info" 
    ], 
    "time": "2016-09-21T19:18:11.184576", 
    "id": 5993765, 
    "changes": "bla bla bla", 
    "action_id": "A" 
    } 

* Dies ist Elastic 1.7 durch die Art und Weise

+0

können Sie ein Beispiel doc? – jay

+0

@jay, schau es dir an – SteveL

Antwort

0

„Ich will nur die Protokolle zurückzuversetzen entsprechen den Wildcards "

Sollte es dann nicht in einer must Klausel anstelle von should sein? Auch terms filter kann mehrere Termkandidaten nehmen, so dass Sie keine separaten Filter für action_id A und B erstellen müssen. Beim Lesen von Dokumenten beachten Sie, dass Abfrage DSL ziemlich viel zwischen 1.x und 2.x Versionen von Elastisearch, Filter und Abfragen geändert hat wurden mehr oder weniger miteinander "verschmolzen".

Edit: Basierend auf dem Kommentar, sollten diese Arbeit die ursprüngliche Abfrage funktionsfähig war unter der Annahme (sorry zu faul, es zu testen):

{ 
    "size": 20, 
    "sort": [{"clsfd_id" : {"order" : "asc"}}], 
    "query":{ 
     "filtered":{ 
      "query":{"match_all":{}}, 
      "filter":{ 
      "bool":{ 
       "should":[ 
        { 
         "query":{ 
         "term": {"id":"*12*"} 
         } 
        }, 
        { 
         "query":{ 
         "term": {"id":"*23*"} 
         } 
        } 
       ], 
       "must":[ 
        { 
         "query":{ 
         "term": {"action_id": ["A", "B"]} 
         } 
        } 
       ] 
      } 
      } 
     } 
    } 
} 

Die ausführlichere Option ist eine neue „Abfrage erstellen => gefiltert => filter => sollte => terms "anstelle des Multi-Term-Filters.

+0

Nein, ich meinte, dass die Übereinstimmung mindestens 1 der Wildcards plus die action_id ist entweder A oder B oder beides, ich habe es falsch geschrieben. – SteveL

0

Funktioniert das?

{ 
"size" : 20, 
"sort" : [{ 
     "date" : { 
      "order" : "asc" 
     } 
    } 
], 
"fields" : [], 
"query" : { 
    "filtered" : { 
     "query" : { 
      "wildcard" : { 
       "id" : { 
        "value" : "*12*" 
       } 
      } 
     }, 
     "filter" : { 
      "terms" : { 
       "action_id" : ["A", "B"] 

      } 
     } 
    } 
} }