有没有选择停止应用分析仪?

时间:2013-07-23 21:33:31

标签: java elasticsearch

您好我正在使用弹性搜索开发迷你应用程序。

设置: -

        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,我得到了所有的结果......你可以为此解决任何问题吗?

1 个答案:

答案 0 :(得分:1)

定义string fields的映射时,您可以定义在索引时和查询时应用的不同分析器,只需使用index_analyzersearch_analyzer属性即可。您当前正在使用analyzer属性,这是在索引和查询时应用同一分析器的快捷方式。事实上,你通常在索引时和查询时应用了一个类似的,如果不相同的文本分析链,但是ngrams绝对是一个例外,因为你不想从你的查询中生成ngram。

您只需定义两个不同的分析器,一个用于生成ngrams,另一个用于生成ngrams。然后像这样更新您的映射:

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