我在为某些字段编制索引时使用两个分析器,对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周开始受到打击...... 提前谢谢
答案 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类非常易于创建复合分析器。