2017-08-30 3 views
0

Ich habe Daten wie unten in ElasticElasticsearch Abfrage mit Und- und Oder-Bedingung

{ 
    "_index": "prod", 
    "_type": "log", 
    "_id": "aa", 
    "_source": { 
    "input_type": "log", 
    "sourcetype": "sourcetypeapp1", 
    "message": "APP COMPANY|80d596f6-2082-4a1d-bcfc-740478f626ec|001 ErrorMessage: Some error" 
    "type": "log", 
    "tags": [ 
     "beats_input_codec_plain_applied" 
    ] 
    } 
} 

ich alle die Nachricht, die unter Daten in Nachricht enthalten suchen wollte: -

(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" AND Message:"ErrorMessage") 
Or 
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" AND Message:"ErrorMessage") 
Or 
(Message : "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" AND Message:"ErrorMessage") 

ich weiß nicht viel über elasticsearch query,

Ich habe versucht unten einfache Abfrage funktioniert nicht (mit nur einer Bedingung):

{ 
    "query": { 
    "bool": { 
     "must": { 
     "bool": { 
      "should": [ 
      { 
       "match": { 
       "Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

Antwort

0

Können Sie mit etwas versuchen, wie

{ 
"query": { 
    "match": { 
    "Message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" 
    } 
} 
} 
+0

Wie kann ich mehrere hinzufügen oder oder Bedingung? –

+0

können Sie verwenden, sollten (OR) und müssen (UND) innerhalb bool Abfrage – DivyaMenon

+0

Ich habe diese Abfrage versucht, ich bekomme kein korrektes Ergebnis, als ob eine Nachricht enthalten -2082- dann werden alle angezeigt.Aber ich will diese ganze Phrase zu entsprechen im ganzen Text, "COMPANY | 80d596f6-2082-4a1d-bcfc-740478f626eA | 001. Sieht aus wie aufgrund Bindestrich –

0
((condition11 AND condition12) OR (condition21 AND condition22)) 

Wenn das ist, was Sie erreichen wollen, versuchen Sie diese

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } }, 
       { "match": { "message": "ErrorMessage"}} 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "must": [ 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } }, 
       { "match": { "message": "ErrorMessage"}} 
      ] 
      } 
     }, 
     { 
      "bool": { 
      "must": [ 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } }, 
       { "match": { "message": "ErrorMessage"}} 
      ] 
      } 
     }   
     ] 
    } 
    } 
} 

Aber in Ihrem Beispiel condition12 und condition22 sind gleich. In diesem Fall können Sie es wie folgt umschreiben:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { "match": { "message": "ErrorMessage"}}, 
     { 
      "bool": { 
      "should": [ 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eA|001" } }, 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eB|002" } }, 
       { "match": { "message": "COMPANY|80d596f6-2082-4a1d-bcfc-740478f626eC|003" } } 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Ich habe versucht, diese Abfrage ich bekomme nicht korrekt Ergebnis, als ob eine Nachricht enthalten 4a1d alle werden angezeigt.Aber ich will diese ganze Phrase im gesamten Text zu vergleichen, "COMPANY | 80d596f6-2082-4a1d-bcfc-740478f626eA | 001" –

+0

Ich dachte, Sie wollten wissen, wie man Multi-ODER-Bedingung von AND Bedingungen verwenden. Wenn Sie den ganzen Text übereinstimmen möchten, Sie sollte keine Platzhalterzeichen verwenden. https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-match-query.html#query-dsl-match-query Match analysiert den von Ihnen bereitgestellten Text und dann die Abfrage erstellen – Dhavaprathap

+0

Aber es hängt davon ab, o n wie Sie das Schema definiert haben. Wenn Nachrichteneigenschaft/-feld nicht als Index definiert ist: not_analyzed (siehe https://www.elastic.co/guide/en/elasticsearch/reference/5.5/mapping-index.html), können Sie keine Platzhalter verwenden um das zu lösen. Weil Ihr Text in Token umgewandelt und als mehrere Strings anstelle einer vollständigen Zeichenfolge gespeichert wurde. In diesem Fall können Sie den vollständigen Text nicht abgleichen, da er nicht vorhanden ist. Sie müssen mehrere Übereinstimmungsabfragen für jedes Teil (z. B. COMPANY, 80d596f6, 2082 usw.) in einem einzelnen Muss schreiben, so wie Sie möchten, dass Zeilen abgerufen werden, die alle enthalten. – Dhavaprathap

Verwandte Themen