我使用Lucene的关键字分析器为OrientDB索引了一个属性:
CREATE INDEX Snippet.ssdeep ON Snippet (ssdeep) FULLTEXT ENGINE LUCENE METADATA {"analyzer":"org.apache.lucene.analysis.core.KeywordAnalyzer"}
该文件包含我已为测试编制索引的数据。
现在,当我使用Lucene进行搜索时,我得到了确切查询的响应,但不是模糊查询(尽管正确地转义了查询文本)。
例如,给定一个值为“192:d4e1GDZYDUZrw9AfCB + A66ancCZmx9n2P:2e1GW18A66ac / YP”的字段,以下查询产生一条记录:
SELECT FROM Snippet WHERE ssdeep LUCENE "192\\:d4e1GDZYDUZrw9AfCB\\+A66ancCZmx9n2P\\:2e1GW18A66ac\\/YP"
虽然此查询不会产生任何记录:
SELECT FROM Snippet WHERE ssdeep LUCENE "192\\:d4e1GDZYDUZrw9AfCB\\+A66ancCZmx9n2P\\:2e1GW18A66ac\\/YP~0.9"
我想知道是什么阻止Lucene找到近似结果?更具体的是Lucene(或KeywordAnalyzer)不适合模糊搜索这样的字符串,还是Lucene和OrientDB之间的接口原因?
即。我在相同的数据库上有其他全文Lucene索引,但所有这些字段都包含普通文本,并使用简单或标准分析器进行分析。这是我真正需要全文索引的唯一字段,它无法正常工作。
答案 0 :(得分:1)
问题是字母大小写。在对术语编制索引之前,StandardAnalyzer,SimpleAnalyzer和EnglishAnalyzer都是小写文本。 KeywordAnalyzer没有。
由于未分析通配符,模糊和其他扩展的多项查询,因此默认情况下,QueryParser会对这些类型的查询进行小写。
我不太了解OrientDB暴露Lucene的内容,以便您有效地做到这一点,但Lucene的两个最佳解决方案是:
禁止QueryParser小写这些类型的查询:
queryParser.setLowercaseExpandedTerms(false);
使用将KeywordTokenizer与LowerCaseFilter结合的自定义分析器:
public class LowercaseKeywordAnalyzer extends Analyzer {
@Override
protected TokenStreamComponents createComponents(String fieldName) {
Tokenizer source = new KeywordTokenizer();
TokenStream filter = new LowerCaseFilter(source);
return new TokenStreamComponents(source, filter);
}
}
我不知道它们是否以及如何在OrientDB中公开,但希望能指出你正确的方向。