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

Java 如何使用lucene查询在hibernate搜索中进行不区分大小写的搜索?,java,lucene,hibernate-search,Java,Lucene,Hibernate Search,在编制索引时,我使用了两个分析器,例如对某些字段使用StandardAnalyzer,对某些字段使用WhitespaceAnalyzer作为特殊字符保存值,如c++,但我将查询编写为 QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Professional.class).get(); BooleanQuery booleanQuery = new BooleanQuery();

在编制索引时,我使用了两个分析器,例如对某些字段使用
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++一样大小写敏感 所以我希望对结果不区分大小写,因为我在索引和搜索时没有使用相同的分析器,所以我错了吗

请帮帮我,因为我从一周前就被折磨了,请帮帮我。。。
提前感谢

您应该使用自定义分析器,并在WhitespaceTokenizer之后添加小写过滤器。像这样:

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);
    }
}

从Hibernate 5.10.3开始,创建自定义lucene analyzer的语法略有更改:

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);
    }
}
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;
 }
然后,为了在自定义字段上使用此分析器,我们只需要通过
@analyzer
注释指定它:

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

或者,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);
    }
}
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;
 }
生成器类非常容易用于创建复合分析器


这里有更多信息:

我也有同样的问题。我对一个字段使用了keyword().wildcard(),但遇到了一个问题,即无法找到小写文字中的not。 解决方案非常简单——在编写任何查询之前,我没有实现Analyzer,而是将搜索词转换为小写。在您的情况下,它将如下所示:

fieldValue=fieldValue.toLowerCase()

QueryBuilder qb=fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Professional.class.get(); BooleanQuery BooleanQuery=新的BooleanQuery()

query=qb.keyword().wildcard().onField(fieldName).ignoreFieldBridge().matching(fieldValue+“*”).createQuery();
添加(query,BooleanClause.occurrent.MUST)

感谢您的回复,如何使用您的代码以及我将这些代码放在了哪个地方,请帮助我,因为我使用注释作为@Analyzer(impl=WhitespaceAnalyzer.class)@Field私有字符串技能;你能用例子详细解释吗?谢谢你,我使用hibernate serarch 4.4.6,所以我使用了自定义分析器,但它显示了必须实现继承的抽象方法分析器。令牌流(字符串,读取器)我的自定义分析器代码是公共类MyAnalyzer extends analyzer{analyzer analyzer=new analyzer(){@Override protected TokenStreamComponents createComponents(最终字符串字段名){Tokenizer source=new WhitespaceTokenizer();TokenStream filter=new LowerCaseAnalyzer(source);返回新的TokenStreamComponents(source,filter);}}}感谢高级公共类MyAnalyzer扩展分析器{Analyzer Analyzer=new Analyzer(){受保护的TokenStreamComponents createComponents(最终字符串字段名){Tokenizer source=new WhitespaceTokenizer();TokenStream filter=new LowerCaseAnalyzer(源代码);return new TokenStreamComponents(source,filter);}}}}我添加了上述代码,如前所述,但我得到了错误,如MyAnalyzer必须实现继承的抽象方法Analyzer.tokenStream(String,Reader),那么如何解决它呢