/ / C'è qualche opzione per interrompere l'applicazione dell'analizzatore? - java, elasticsearch

C'è qualche opzione per smettere di applicare l'analizzatore? - java, elasticsearch

Salve, sto sviluppando una mini applicazione utilizzando Elastic Search.

Ambientazione :-

        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();

Mappatura :-

        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();

Qui ho specificato il filtro nGram. ma per qualche motivo durante il processo di ricerca non voglio applicare l'analizzatore per prefixFilter o prefixQuery. c'è qualche opzione. Il problema che sto affrontando qui è,

per es.

    apple
one apple
two apple

presumere che quelli siano valori firstName daesempio. quando cerco il prefisso un carattere "a", devo voler ottenere solo il documento "mela". ma in questo momento, sto ottenendo tutti i risultati grazie a nGram ... puoi per favore qualche soluzione per questo?

risposte:

1 per risposta № 1

Quando definisci la mappatura per il tuo file campi stringa puoi definire diversi analizzatori applicati al momento dell'indice e al momento della query, semplicemente utilizzando il index_analyzer e search_analyzer proprietà. Stai attualmente utilizzando il analyzer proprietà che è una scorciatoia per applicare lo stessoanalizzatore sia al momento dell'indice che della query. In effetti di solito hai una catena di analisi del testo simile, se non uguale, applicata al momento dell'indice e al momento della query, ma i ngram sono sicuramente un'eccezione poiché non vuoi estrarre ngram dalle tue query.

Devi solo definire due diversi analizzatori, uno che crea ngram e l'altro che non lo fa. Aggiorna quindi la tua mappatura in questo modo:

.startObject("firstName")
.field("type","string")
.field("index_analyzer", "ngrams_analyzer")
.field("search_analyzer", "search_analyzer_without_ngrams")