2016-04-27 1 views
3

Ich habe Probleme zu formulieren, was ich suche, so dass ich ein Beispiel verwenden werden:Elasticsearch Aggregationsmuster zu extrahieren und OCCURENCES

Sie stellen drei Dokumente in Elasticsearch alle mit einem Feld „name“ diese Werte enthalten: " test "," superTest51 "," stvv ".

Ist es möglich, einen regulären Ausdruck wie Muster mit den Vorkommen zu extrahieren? In diesem Fall:

  • "xxxx": 2 Vorkommnisse
  • "x {5} Xxxx99": 1 Vorkommen

Ich habe einige Dinge über Analysatoren lesen, aber ich glaube nicht, das ist, was ich suche.

Jede Hilfe würde sehr geschätzt werden.

Bearbeiten: Um die Frage klarer zu machen: Ich möchte nicht nach einem Regex-Muster suchen, ich möchte ein Aggregat auf einem regulären Ausdruck ersetzt Feld. Zum Beispiel ersetzen [a-z] durch x. Ist der beste Weg wirklich, den regulären Ausdruck außerhalb von elasticsearch zu ersetzen?

Antwort

2

Basierend auf der Formulierung Ihrer Anfrage, nicht sicher, dieses Spiel, was Sie suchen, aber vorausgesetzt, Sie basiert auf regex zu Suche bedeuten sollte folgenden sein, was Sie suchen:

wildcard and regexp queries

Beachten Sie, dass das Verhalten unterschiedlich ist, unabhängig davon, ob das Feld analysiert wird oder nicht. Normalerweise, wenn Sie mit dem Vanilla-Setup von Elasticsearch gehen, wie die meisten Leute zu starten, wird Ihr Feld wahrscheinlich analysiert werden, können Sie Ihre Events Mapping in Ihren Indizes überprüfen, um dies zu bestätigen.

Basierend auf Ihrem Beispiel und unter der Annahme, Sie Namen Feld not_analyzed haben:

GET _search 
{ 
    "query": { 
    "regexp": { 
     "name": "[a-z]{4}" 
    } 
    } 
} 

GET _search 
{ 
    "query": { 
    "regexp": { 
     "name": "[a-z]{5}[A-Z][a-z]{3}[0-9]{2}" 
    } 
    } 
} 

auf Ihrem Update Basierend und eine schnelle Suche (ist nicht so vertraut mit Aggregationen), in etwa wie folgt sein könnte würde Ihren Erwartungen entsprechen:

GET _search 
{ 
    "size": 0, 
    "aggs": { 
    "regmatch": { 
     "filters": { 
     "filters": { 
      "xxxx": { 
      "regexp": { 
       "name": "[a-z]{4}" 
      } 
      }, 
      "x{5}Xxxx99": { 
      "regexp": { 
       "name": "[a-z]{5}[A-Z][a-z]{3}[0-9]{2}" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Dies wird Ihnen 3 zählt geben: - Gesamtzahl der Ereignisse - Anzahl der ersten Regex - Nummer der zweiten Regex übereinstimmen

+0

Danke für die Antwort. Es ist nicht wirklich das, was ich im Sinn hatte, ich habe meine Frage aktualisiert, um es klarer zu machen. – Bert

+0

Das würde bedeuten, dass ich einen benutzerdefinierten Regex-Filter für jedes Muster erstellen muss, das meine Daten enthalten könnten, während ich alle möglichen Muster in meinen Daten und deren Häufigkeit finden möchte. – Bert

+0

Dann bin ich ein wenig verwirrt, wie Sie erwarten würden, dass ElasticSearch Ihnen das zur Verfügung stellt, wenn man bedenkt, dass für einen Eintrag wie "test" zum Beispiel ** einige gültige Muster passen würden: "test" [az] est', '[az] {4}', '[az] {4,}'. Die Anzahl der möglichen übereinstimmenden Muster ist für jedes Ihrer Ereignisse enorm. die zu schätzen, die du in Betracht ziehen willst, scheint schwierig ... – Olivier