您好我正在使用弹性搜索开发迷你应用程序。
设置: -
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();
映射: -
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();
这里我指定了nGram过滤器。但由于某些原因,在进行搜索过程时,我不想将分析器应用于prefixFilter或prefixQuery。有没有选择。 我在这里面临的问题是,
例如。
apple
one apple
two apple
假设这些是示例中的firstName值。 当我搜索前缀字符'a'时,我必须只想获得'apple'文件。但是现在,由于nGram,我得到了所有的结果......你可以为此解决任何问题吗?
答案 0 :(得分:1)
定义string fields的映射时,您可以定义在索引时和查询时应用的不同分析器,只需使用index_analyzer
和search_analyzer
属性即可。您当前正在使用analyzer
属性,这是在索引和查询时应用同一分析器的快捷方式。事实上,你通常在索引时和查询时应用了一个类似的,如果不相同的文本分析链,但是ngrams绝对是一个例外,因为你不想从你的查询中生成ngram。
您只需定义两个不同的分析器,一个用于生成ngrams,另一个用于生成ngrams。然后像这样更新您的映射:
.startObject("firstName")
.field("type","string")
.field("index_analyzer", "ngrams_analyzer")
.field("search_analyzer", "search_analyzer_without_ngrams")