/ / Gibt es eine Option, die Anwendung des Analysators zu beenden? - Java, Elasticsearch

Gibt es eine Möglichkeit, die Anwendung des Analysegeräts zu beenden? - Java, Gummisuche

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 № 1

Wenn 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")