Java 为什么在Lucene 4,1 analyzer中使用MappingCharFilter会破坏通配符匹配
在分析器中使用MappingCharFilter中断通配符匹配 我创建了这个简单的StripSpaceandSeparatorsAnalyzerJava 为什么在Lucene 4,1 analyzer中使用MappingCharFilter会破坏通配符匹配,java,lucene,Java,Lucene,在分析器中使用MappingCharFilter中断通配符匹配 我创建了这个简单的StripSpaceandSeparatorsAnalyzer public class StripSpacesAndSeparatorsAnalyzer extends Analyzer { protected NormalizeCharMap charConvertMap; protected void setCharConvertMap() { NormalizeChar
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
不再有效
我做错了什么请让我猜猜:要解析查询,您使用的是常规的
QueryParser
,对吗
尝试使用,它应该会起作用。从javadoc:
覆盖Lucene的默认QueryParser,以便Fuzzy-,Prefix-,
范围-和通配符查询也通过给定的分析器传递,
但通配符(如*)不会从搜索中删除
条件
您正在将同一个分析器传递给吗?是的,我正在传递同一个分析器,好的,我会尝试,但我不明白为什么常规查询解析器在使用我的分析器时只会出错。@PaulTaylor若要了解您的分析器为什么不工作,请尝试在标记这些内容(查询和索引字段)时调试它看看它实际上制造了什么代币。然后尝试添加/删除/修改其中的内容,以便创建所需的标记