当遇到模糊查询时,Lucene会对OrientDB采取行动

时间:2015-04-24 17:03:20

标签: indexing lucene orientdb fuzzy-search

我使用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索引,但所有这些字段都包含普通文本,并使用简单或标准分析器进行分析。这是我真正需要全文索引的唯一字段,它无法正常工作。

1 个答案:

答案 0 :(得分:1)

问题是字母大小写。在对术语编制索引之前,StandardAnalyzer,SimpleAnalyzer和EnglishAnalyzer都是小写文本。 KeywordAnalyzer没有。

由于未分析通配符,模糊和其他扩展的多项查询,因此默认情况下,QueryParser会对这些类型的查询进行小写。

我不太了解OrientDB暴露Lucene的内容,以便您有效地做到这一点,但Lucene的两个最佳解决方案是:

  1. 禁止QueryParser小写这些类型的查询:

    queryParser.setLowercaseExpandedTerms(false);
    
  2. 使用将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);
        }
    }
    
  3. 我不知道它们是否以及如何在OrientDB中公开,但希望能指出你正确的方向。