2013-07-23 22 views
0

嗨我正在开发使用弹性搜索的迷你应用程序。是否有任何选项可停止应用分析仪?

环境: -

 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 

假设这些是来自example的firstName值。 当我搜索字符'a'的前缀时,我必须只想获得'apple'文档。但现在,我得到所有的结果,因为nGram ...你可以请任何解决方案吗?

+0

你能否阐明答案是否有用或完全关闭? :) – javanna

回答

1

当您为您的string fields定义映射时,可以使用index_analyzersearch_analyzer属性定义应用于索引时间和查询时间的不同分析器。您目前正在使用analyzer属性,该属性是在索引和查询时间应用相同分析器的快捷方式。实际上,在索引时间和查询时间,通常应用相似的文本分析链(如果不是相等的话),但ngrams绝对是一个例外,因为您不想在查询中生成ngram。

您只需定义两个不同的分析仪,一个用于制作ngram,另一个则不用。更新那么你的映射是这样的:

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

这会解决他的问题吗?他(或她)说,搜索“a”应该只匹配“苹果”而不是“一个苹果”。但是如果在索引时间“一个苹果”被破坏,那么它将匹配(如果'min_gram'为1)。 – ramseykhalaf

+0

@ramseykhalaf我这么认为。问题的这一部分并不明确,但如果我解决了这个问题,问题就是在查询时停止制作ngram。无论如何,我想我们很快就会发现! :) – javanna

相关问题