在分析器中使用MappingCharFilter打破通配符匹配
我创建了这个简单的StripSpacesAndSeparatorsAnalyzer
public class StripSpacesAndSeparatorsAnalyzer extends Analyzer {
protected NormalizeCharMap charConvertMap;
protected void setCharConvertMap() {
NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
builder.add(" ","");
builder.add("-","");
builder.add("_","");
builder.add(":","");
charConvertMap = builder.build();
}
public StripSpacesAndSeparatorsAnalyzer() {
setCharConvertMap();
}
@Override
protected TokenStreamComponents createComponents(String fieldName,
Reader reader) {
Tokenizer source = new KeywordTokenizer(reader);
TokenStream filter = new LowercaseFilter(source);
return new TokenStreamComponents(source, filter);
}
@Override
protected Reader initReader(String fieldName,
Reader reader)
{
return new MappingCharFilter(charConvertMap, reader);
}
}
这样它就会忽略字段中的某些字符,例如连字符,以便我可以搜索
catno:WRATHCD25
catno:WRATHCD-25
并获得相同的结果,并且有效(添加到索引的字段的原始值是WRATHCD-25)
然而,通配符搜索存在问题
catno:WRATHCD25*
有效,但
catno:WRATHCD-25*
没有
如果我修改分析器以注释掉initReader()方法,那么
catno:WRATHCD-25*
现在有效,但当然
catno:WRATHCD25
不再有效。
Wham我做错了
答案 0 :(得分:1)
我猜:要解析查询,您使用的是常规QueryParser
,对吗?
尝试使用AnalyzingQueryParser
,它应该可以解决问题。来自javadoc:
覆盖Lucene的默认QueryParser,以便模糊,前缀 - , Range-和WildcardQuerys也通过给定的分析器传递, 但不会从搜索中删除外卡字符(如*) 术语