Hallo, ich entwickle eine Mini-Anwendung mit Elastic Search.
Einstellung: -
settingBuilder = XContentFactory.jsonBuilder().startObject()
.startObject("index")
.startObject("analysis")
.startObject("analyzer")
.startObject("custom_analyzer")
.field("type", "custom")
.field("tokenizer","keyword")
.field("filter", new String[]{"standard","ngram_filters"})
.endObject()
.endObject()
.startObject("filter")
.startObject("ngram_filters")
.field("type", "nGram")
.field("min_gram", "1")
.field("max_gram","10")
.endObject()
.endObject()
.endObject()
.endObject()
.endObject();
Kartierung :-
contentBuilder = XContentFactory.jsonBuilder().startObject()
.startObject("students")
.startObject("properties")
.startObject("searchColumn")
.field("analyzer", "custom_analyzer")
.field("type", "string")
.endObject()
.startObject("firstName")
.field("type","string")
.field("analyzer", "custom_analyzer")
.field("store", "yes")
.endObject()
.startObject("lastName")
.field("type","string")
.field("analyzer", "custom_analyzer")
.field("store", "yes")
.endObject()
.startObject("registerNumber")
.field("type", "long")
.field("analyzer", "custom_analyzer")
.field("store", "yes")
.endObject()
.endObject()
.endObject()
.endObject();
Hier habe ich nGram Filter angegeben. Aber aus irgendeinem Grund möchte ich während des Suchvorgangs keinen Analysator für prefixFilter oder prefixQuery anwenden. Gibt es eine Option? Das Problem, mit dem ich hier konfrontiert bin, ist:
für z.
apple
one apple
two apple
Angenommen, dies sind Vorname-Werte vonBeispiel. Wenn ich ein Zeichen "a" vorstelle, muss ich nur das Dokument "apple" erhalten wollen. aber im Moment bekomme ich alle Ergebnisse wegen nGram ... kannst du bitte eine Lösung dafür?
Antworten:
1 für die Antwort № 1Wenn Sie das Mapping für Ihre definieren Zeichenfolgenfelder Sie können verschiedene Analysatoren definieren, die zur Index- und Abfragezeit angewendet werden index_analyzer
und search_analyzer
Eigentum. Sie verwenden derzeit die analyzer
Eigenschaft, die eine Verknüpfung ist, um dasselbe anzuwendenAnalysator sowohl zur Index- als auch zur Abfragezeit. Tatsächlich wird normalerweise eine ähnliche, wenn nicht gleichwertige Textanalysekette zur Index- und Abfragezeit angewendet, aber ngrams sind definitiv eine Ausnahme, da Sie aus Ihren Abfragen keine ngrams machen möchten.
Sie müssen nur zwei verschiedene Analysatoren definieren, einen, der ngrams erstellt, und einen, der dies nicht tut. Aktualisieren Sie dann Ihr Mapping wie folgt:
.startObject("firstName")
.field("type","string")
.field("index_analyzer", "ngrams_analyzer")
.field("search_analyzer", "search_analyzer_without_ngrams")