0

您好我正在使用 Elastic Search 开发迷你应用程序。

环境 :-

        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,我得到了所有结果......你能请任何解决方案吗?

4

1 回答 1

1

当您为字符串字段定义映射时,您可以定义在索引时间和查询时间应用的不同分析器,只需使用index_analyzerandsearch_analyzer属性。您当前正在使用该analyzer属性,它是在索引和查询时应用相同分析器的快捷方式。事实上,您通常在索引时间和查询时间应用类似(如果不相等)的文本分析链,但 ngram 绝对是一个例外,因为您不想从查询中生成 ngram。

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

.startObject("firstName")
.field("type","string")
.field("index_analyzer", "ngrams_analyzer")
.field("search_analyzer", "search_analyzer_without_ngrams")
于 2013-07-23T21:58:13.630 回答