2017-06-09 33 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'應該全部返回,但它什麼都不返回 –