2016-06-08 13 views
6

Ich habe einen Link wie http://drive.google.com und ich möchte "google" aus dem Link abgleichen.Wie mache ich eine Teilübereinstimmung in Elasticsearch?

ich habe:

query: { 
    bool : { 
     must: { 
      match: { text: 'google'} 
     } 
    } 
} 

Aber das paßt nur, wenn der ganze Text 'Google' (Groß- und Kleinschreibung, so auch sie paßt Google oder Google usw.) ist. Wie stimme ich für die "google" innerhalb einer anderen Zeichenfolge überein?

+0

Vielleicht kann 'match: {text: '. * Google. *'}' Helfen. –

+0

Super, das hat funktioniert! Können Sie Ihre Antwort als "Antwort" angeben, damit ich sie als die beste auswählen kann? – user3835653

+0

Ich habe die Antwort hinzugefügt und einige relevante Referenz geliefert. –

Antwort

5

Der Punkt ist, dass die Elasticsearch regex Sie requires a full string match verwenden:

Lucene die Muster immer verankert sind. Das angegebene Muster muss mit der gesamten Zeichenfolge übereinstimmen.

So ein beliebiges Zeichen übereinstimmen (aber eine neue Zeile), können Sie .* Muster verwenden:

match: { text: '.*google.*'} 
       ^^  ^^ 

Eine weitere Variante ist für die Fälle, wenn die Zeichenfolge Zeilenumbrüche haben: match: { text: '(.|\n)*google(.|\n)*'}. Diese schreckliche (.|\n)* ist ein Muss in ElasticSearch, weil diese Regex-Geschmack keine [\s\S] Workarounds, noch irgendwelche DOTALL/Singleline Flags erlaubt. "The Lucene regular expression engine is not Perl-compatible but supports a smaller range of operators."

+0

Das funktioniert nicht für mich. – Battousai

+0

@Battousai Fühlen Sie sich frei, eine Frage zu stellen. Wahrscheinlich gibt es ein Problem mit * wie * Sie die Regex verwenden. –

0

Zum teilweisen Abgleich können Sie entweder prefix oder verwenden.

0

Für eine allgemeinere Lösung können Sie einen anderen Analysator verwenden oder Ihren eigenen definieren. Ich nehme an, dass Sie den Standardanalysator verwenden, der http://drive.google.com in die Token "http" und "drive.google.com" aufteilen würde. Aus diesem Grund funktioniert die Suche nach Google nicht, da es versucht, es mit dem vollständigen "drive.google.com" zu vergleichen.

Wenn Sie stattdessen Ihre Dokumente mit dem einfachen Analysator indiziert haben, würden sie in "http", "drive", "google" und "com" aufgeteilt. Auf diese Weise können Sie jeden dieser Begriffe selbst zuordnen.

Verwandte Themen