ElasticSearch - Suche mit Bindestrichen
Elastic Search 1.6
Möchte ich index text mit Bindestrichen, z.B. U-12, U-17 -, WU-12, t-shirt... und in der Lage sein, eine "Simple Query-String" - Abfrage, um die Suche auf Sie.
Daten-Beispiel (vereinfacht):
{"title":"U-12 Soccer",
"comment": "the t-shirts are dirty"}
Da gibt es eine ganze Reihe von Fragen, die bereits über Bindestriche, versuchte ich die folgende Lösung bereits:
Verwenden einen Char filter: ElasticSearch - Suche mit Bindestrichen im Namen.
Also ging ich für diese Zuordnung:
{
"settings":{
"analysis":{
"char_filter":{
"myHyphenRemoval":{
"type":"mapping",
"mappings":[
"-=>"
]
}
},
"analyzer":{
"default":{
"type":"custom",
"char_filter": [ "myHyphenRemoval" ],
"tokenizer":"standard",
"filter":[
"standard",
"lowercase"
]
}
}
}
},
"mappings":{
"test":{
"properties":{
"title":{
"type":"string"
},
"comment":{
"type":"string"
}
}
}
}
}
Suche erfolgt mit der folgenden Abfrage:
{"_source":true,
"query":{
"simple_query_string":{
"query":"<Text>",
"default_operator":"AND"
}
}
}
-
Was funktioniert:
"U-12", "U*", "t*", "ts*"
-
Was hat nicht funktioniert:
"U-*", "u-1*", "t-*", "t-sch*", ...
So scheint es, die char-filter wird nicht ausgeführt, auf search strings?
Was könnte ich tun, um diese Arbeit zu machen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist wirklich einfach:
Zitat von Igor Motov: Konfigurieren der standard-tokenizer
Zitat von Igor Motov ist wahr, Sie müssen hinzufügen "analyze_wildcard":true, um es mit regex gearbeitet. Aber es ist wichtig zu bemerken, dass der Bindestrich eigentlich tokenizes "u-12" in "u", "12", zwei getrennte Wörter.
wenn die Erhaltung der ursprünglichen ist nicht wichtig: verwenden Sie Mapping-char-filter. Ansonsten ist ziemlich nützlich.
Vorstellen, dass Sie "m0-77", "m1-77" und "m2-77", wenn Sie suchen m*-77 Sie gehen zu müssen, null Treffer. Sie können jedoch remplace "-" (Bindestrich) mit UND um die Verbindung der beiden separed Worte und dann nach m* UND 77, die gehen, um Ihnen einen richtigen Treffer.
können Sie tun es in der client-front.
In Ihre problem u-*
t-sh*
Falls jemand noch auf der Suche für eine einfache Problemumgehung für dieses Problem, ersetzen Sie den Bindestrich mit Unterstrich
_
bei der Indizierung von Daten.ZB, O-000022334 sollte indiziert als O_000022334.
Beim suchen, ersetzen, Unterstrich zurück zum Bindestrich wieder, wenn die Ergebnisse angezeigt werden. Auf diese Weise können Sie die Suche für "O-000022334" und es findet eine korrekte übereinstimmung.