2011-08-13 6 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]+을 기대하지만, 그렇지 않습니다. 나는 자바로 정규 표현식을 테스트했는데 성공했다.

답변

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와 함께 작동하는지, 전체 필드를 단일 용어로 만들었습니다. 하나의 경고. 분석되지 않은 입력란을 만들면 먼저 검색 색인 (예 : 실적)을 사용하는 이점 대부분을 포기합니다. – femtoRgon