2017-01-07 104 views
1

我有搜索很多次,但不能修復我的問題, 這裏是我的代碼:的Apache Lucene搜索與停止的話

BooleanJunction<BooleanJunction> booleanJunction = queryBuilder.bool(); 

    String[] fields = new String[]{"field1","field2","field2"}; 
    MultiFieldQueryParser mfqp = new MultiFieldQueryParser(fields,new StandardAnalyzer(CharArraySet.EMPTY_SET)); 
    for (String token : tokens) { 
     booleanJunction.should(mfqp.parse(token + "*")); 
    } 

在這種情況下,沒有例外,當令牌是禁用詞(和,一,等等),但它不搜索確切的關鍵字。

E.g,如果有索引「andtest」,它返回此項目,但如果有「和測試」但這並沒有搜索這個項目。

可不可以給我一個建議,這裏有什麼錯?

回答

1

當指數「和測試」中,StandardAnalyzer(這是默認設置)將令牌化這兩個不同的方面:「和」和「測試」。因此,搜索「和測試*」將不匹配其中具有「和測試」的文檔。

的常用方法來匹配文檔中的多個方面是使用短語查詢,但those don't support wildcards

如果你想解決你的具體問題,並使「和*」匹配和測試通配符,一個具有shingle filter的自定義分析器可能是要走的路。我從來沒有用過它,但你可以試試看。

你或許應該考慮this resource有關分析概念的詳細信息(here尤其是)。這是Solr的文檔,所以一些概念無關的你(尤其是XML片斷),但大部分高層次的概念(標記化,過濾,詞幹,...)仍然適用。最重要的是,這個頁面列出了一堆分析器/標記器/過濾器,這些都可以在Hibernate Search/Lucene中使用。

對於相關的一切在Hibernate Search的配置分析,看看here

在一個側面說明,如果您要添加通配符(「*」)自己,它可能意味着你應該使用自定義分析儀代替edgeNGramFilter。但它有點複雜,因爲在索引和查詢時你必須使用不同的分析器。所以通配符應該現在:)

被罰款