2017-06-09 39 views
0

我想从一个文本NGramFilterFactory不能正常工作

提取关键词例如,如果nameEn =“大家好今天”,我做的关键字搜索“身体”它让我看到结果

我用注释AnalyzerDef,但我有我的代码有问题

我会解释这个问题:

nameEn =“大家好今天”

例如,当我搜索“B”,它让我看到结果

但是,当我搜索“博”,“董事会”或“身体”,它显示了我什么

现在,当我改变minGramSize 2

当我搜索“微博”,它让我看到结果

而其他关键词“b”,“董事会”,“身体”它让我看到什么

我做不知道问题究竟在哪里,因为根据下面的代码,当我进入红色的 “博”

输出将是: “B”, “博”

@Indexed 
    @AnalyzerDef(name = "autocompleteNGramAnalyzer", tokenizer = 
     @TokenizerDef(factory = StandardTokenizerFactory.class), filters = { 
     @TokenFilterDef(factory = WordDelimiterFilterFactory.class), 
     @TokenFilterDef(factory = LowerCaseFilterFactory.class), 
     @TokenFilterDef(factory = NGramFilterFactory.class, params = { 
     @Parameter(name = "minGramSize", value = "1"), 
     @Parameter(name = "maxGramSize", value = "50") }), 
     @TokenFilterDef(factory = PatternReplaceFilterFactory.class, params = { 
     @Parameter(name = "pattern", value = "([^a-zA-Z0-9\\.])"), 
     @Parameter(name = "replacement", value = " "), @Parameter(name = "replace", value = "all") }) }) 
    @Analyzer(definition = "autocompleteNGramAnalyzer") 
    public class Product implements Serializable { 

    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO) 
    private String nameEn; 

的搜索方法:

public List<Product> searchProduct(String keyWord) { 
    FullTextSession fullTextSession = Search.getFullTextSession(getSession()); 
    try { 
     fullTextSession.createIndexer().startAndWait(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get(); 
    org.apache.lucene.search.Query luceneQuery = queryBuilder.phrase().withSlop(2).onField("nameEn").boostedTo(5).sentence(keyWord.toLowerCase()).createQuery(); 
    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class); 
    List<Product> result = fullTextQuery.list(); 
    return result; 
} 

任何帮助表示赞赏

回答

0

你可以尝试使用关键字查询而不是短语查询:queryBuilder.keyword().onField("nameEn").boostedTo(5).matching(keyWord.toLowerCase()).createQuery();

如果您的分析仪名称为sugg ests,你正在做自动完成,短语查询可能不相关。无论如何,这将是实现工作的第一步。

在附注中,您可能想要防止在分析查询时生成n-gram(特别是在需要短语查询时)。如需更多关于这个,看到这个答案的“编辑”部分:Hibernate search to find partial matches of a phrase

+0

我用同样的例子,但是当我用EdgeNGramTokenFilter.class它表明我这个错误:类型不匹配:不能从类转换到类<?扩展TokenFilterFactory> –

+0

@AymenKanzari对,在例子中出现了一个错字:EdgeNGramTokenFilter.class应该是EdgeNGramTokenFilterFactory.class。我修正了这个例子。 –

+0

注意:没有EdgeNGramTokenFilterFactory.class,有EdgeNGramFilterFactory.class。我也有同样的问题。例如: nameEn = [Juno Taylor,Tom Caner Junior,Alan Smith,John Cane,这款休闲衬衫有一个普通领子...]。 'jun'返回Juno Taylor和Tom Caner Junior, 'an'应该会返回Alan Smith,John Cane,Tom Caner Junior和这款休闲衬衫有一个中国领......但它不会返回 'a'或' n'应该全部返回,但它什么都不返回 –