2015-04-24 69 views
0

我已經索引的OrientDB財產面臨上OrientDB演戲:Lucene的時候使用Lucene的關鍵字分析器模糊查詢

CREATE INDEX Snippet.ssdeep ON Snippet (ssdeep) FULLTEXT ENGINE LUCENE METADATA {"analyzer":"org.apache.lucene.analysis.core.KeywordAnalyzer"} 

備案的包含,我已經編入索引的測試simhashes。

現在,當我搜索使用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

問題是字母大小寫。 StandardAnalyzer,SimpleAnalyzer和EnglishAnalyzer所有小寫文本索引條款之前。 KeywordAnalyzer沒有。

由於通配符,模糊,和其他擴展,多字詞的查詢,不分析,在QueryParser的,默認情況下,小寫這些類型的查詢。

我不知道很多關於什麼OrientDB暴露了Lucene,讓你有效地做到這一點,但在Lucene的兩個最好的解決方案是:

  1. 禁用的QueryParser lowercasing這些類型的查詢:

    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); 
        } 
    } 
    

我既不知道是否也不怎麼這些在OrientDB暴露,但希望這點你在正確的方向。