2011-08-13 11 views
0

私はLuceneで正規表現を使って "Bug reports"を探していますが、試してみるとうまくいきません。Luceneを使用して正規表現一致を検索しますか?

悪い設定を避けるために、Lucene pageのコードを使用しました。

は、ここに私のコードです:

import java.util.regex.Pattern; 

import org.apache.lucene.analysis.SimpleAnalyzer; 
import org.apache.lucene.document.Document; 
import org.apache.lucene.document.Field; 
import org.apache.lucene.index.IndexWriter; 
import org.apache.lucene.index.Term; 
import org.apache.lucene.search.IndexSearcher; 
import org.apache.lucene.search.regex.JakartaRegexpCapabilities; 
import org.apache.lucene.search.regex.RegexCapabilities; 
import org.apache.lucene.search.regex.RegexQuery; 
import org.apache.lucene.store.RAMDirectory; 

public class Rege { 

    private static IndexSearcher searcher; 
    private static final String FN = "field"; 

    public static void main(String[] args) throws Exception { 
    RAMDirectory directory = new RAMDirectory(); 
    try { 

     IndexWriter writer = new IndexWriter(directory, 
      new SimpleAnalyzer(), true, 
      IndexWriter.MaxFieldLength.LIMITED); 
     Document doc = new Document(); 
     doc 
      .add(new Field(
       FN, 
       "[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)", 
       Field.Store.NO, Field.Index.ANALYZED)); 
     writer.addDocument(doc); 
     writer.optimize(); 
     writer.close(); 
     searcher = new IndexSearcher(directory, true); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    System.err.println(regexQueryNrHits("bug [0-9]+",null)); 

    } 

    private static Term newTerm(String value) { 
    return new Term(FN, value); 
    } 

    private static int regexQueryNrHits(String regex, 
     RegexCapabilities capability) throws Exception { 

    RegexQuery query = new RegexQuery(newTerm(regex)); 

    if (capability != null) 
     query.setRegexImplementation(capability); 

    return searcher.search(query, null, 1000).totalHits; 
    } 

} 

私は1を返すようにbug [0-9]+を期待するだろうが、それはしていません。私はJavaで正規表現をテストしてもうまくいきました。

答えて

0

「文字列」タイプではなく「文字列」タイプのフィールドにインデックスを付けると、正規表現はの全体のフィールド値に一致する必要があります。
は、フィールドの両端に外にあなたの正規表現をとる、これを試してみてください:

System.err.println(regexQueryNrHits("^.*bug [0-9]+.*$",null)); 
0

おかげで、しかし、これだけでは問題は解決しませんでした。問題はField.Index.ANALYZEDフラグです:

luceneは正規表現を使用できるように数字を適切な方法でインデックス化していないようです。

は私が変更されました:

doc.add(new Field(
FN,"[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",Field.Store.NO, Field.Index.ANALYZED)); 

doc.add(new Field(
FN,"[Phpmyadmin-devel] Commits against bug 601721 (Cookie auth mode faulty with IIS)",Field.Store.NO, Field.Index.NOT_ANALYZED)); 

にして、改善された正規表現と:それは最終的に働いた

System.err.println(regexQueryNrHits("^.*bug #+[0-9]+.*$", 
new JavaUtilRegexCapabilities())); 

! :)

+0

問題は数値ではありません。問題は、正規表現のクエリと分析をどのように連携させることにありますか?正規表現はフィールド全体ではなく、*用語*と一致しなければなりません。それがなぜNOT_ANALYZEDで動作するのかという理由で、あなたは全体のフィールドを単一の用語にしました。しかし、1つの警告。そのようなフィールドを分析しないようにすると、検索インデックスを最初に使用する利点(パフォーマンスなど)のほとんどを放棄します。 – femtoRgon

関連する問題