如何使用lucene查询在hibernate搜索中搜索不区分大小写?

时间:2016-06-28 15:28:10

标签: java lucene hibernate-search

我在为某些字段编制索引时使用两个分析器,对StandardAnalyzer进行索引,对于某些保持值为WhitespaceAnalyzer等特殊字符的字段c++,我正在编写查询

QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Professional.class).get();
BooleanQuery booleanQuery = new BooleanQuery();

query = qb .keyword().wildcard().onField(fieldName).ignoreFieldBridge().matching(fieldValue+"*").createQuery();
booleanQuery.add(query, BooleanClause.Occur.MUST);

上面的查询返回的结果与c ++和C ++一样区分大小写 所以我想要结果的acheive case insensitve,因为我在索引以及搜索时没有使用相同的分析器,所以我错了

PLZ帮助我,因为我从1周开始受到打击...... 提前谢谢

3 个答案:

答案 0 :(得分:1)

我有同样的问题。我在一个字段中使用keyword()。wildcard()并遇到找不到小写单词 not 的问题。 解决方案非常简单-在编写任何查询之前,无需实施Analyzer I将搜索字词转换为小写形式。在您的情况下,它看起来像这样:

fieldValue = fieldValue.toLowerCase();

QueryBuilder qb = fullTextSession.getSearchFactory()。buildQueryBuilder()。forEntity(Professional.class).get(); BooleanQuery booleanQuery = new BooleanQuery();

query = qb.keyword()。wildcard()。onField(fieldName).ignoreFieldBridge()。matching(fieldValue +“ *”)。createQuery(); booleanQuery.add(query,BooleanClause.Occur.MUST);

答案 1 :(得分:0)

您应该使用自定义分析器并在WhitespaceTokenizer之后添加LowerCaseFilter。像这样:

Analyzer analyzer = new Analyzer() {
    @Override
    protected TokenStreamComponents createComponents(final String fieldName) {
        Tokenizer source = new WhitespaceTokenizer();
        TokenStream filter = new LowerCaseAnalyzer(source);
        return new TokenStreamComponents(source, filter);
    }
}

答案 2 :(得分:0)

从Hibernate 5.10.3开始,用于创建自定义lucene分析器的语法略有变化:

public class CustomAuthorAnalyzer extends Analyzer {

    @Override
    protected TokenStreamComponents createComponents(final String fieldName) {
        Tokenizer source = new WhitespaceTokenizer();
        TokenStream filter = new LowerCaseFilter(source);
        return new TokenStreamComponents(source, filter);
    }
}

然后,为了在自定义字段上使用此分析器,我们只需要通过@Analyzer批注来指定它:

@Analyzer(impl = CustomAuthorAnalyzer.class)
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
private String author;

希望有帮助。

或者,lucene还提供了一种轻松组成新的自定义分析器的机制:

public static Analyzer create() throws IOException {
    Analyzer ana = CustomAnalyzer.builder(Paths.get("/path/to/config/dir"))
            .withTokenizer(WhitespaceTokenizerFactory.class)
            .addTokenFilter(LowerCaseFilterFactory.class)
            .addTokenFilter(StopFilterFactory.class, "ignoreCase", "false", "words", "stopwords.txt", "format", "wordset")
            .build();
     return ana;
 }

builder类非常易于创建复合分析器。

此处有更多信息:https://lucene.apache.org/core/6_4_2/analyzers-common/org/apache/lucene/analysis/custom/CustomAnalyzer.html

相关问题