2014-06-05 2 views
-1

내가 싸우고있는 것을 더 잘 나타내도록 내 원래 질문을 편집하십시오. 여기 내 문제 도메인입니다. 저는 소프트웨어 회사의 테스트 부서에 있습니다. 우리는 그루비 스크립트를 작성하여 소프트웨어를 테스트합니다. 소프트웨어는 로그하는 경고 및 오류 메시지에 대한 키 값 쌍이 들어있는 특성 파일을 사용합니다.Lucene 4.8.1 일치하는 항목이 없습니다.

내가하고 싶은 일은 내 Groovy 스크립트 (그 중 300+ 이상)를 인덱싱 한 다음 내 등록 정보 파일을 반복하고 어떤 스크립트가 특정 오류 메시지를 확인하는지 확인하는 것입니다. 속성의

예를 들어 파일 :

B_C_Patched=Patched 

이 단지 하나의 문자열 쌍이며, 그 중 3000 이상이있다.

import org.apache.lucene.analysis.Analyzer 
import org.apache.lucene.analysis.core.WhitespaceAnalyzer 
import org.apache.lucene.document.Document 
import org.apache.lucene.document.Field 
import org.apache.lucene.document.StringField 
import org.apache.lucene.index.IndexReader 
import org.apache.lucene.index.IndexWriter 
import org.apache.lucene.index.IndexWriterConfig 
import org.apache.lucene.index.Term 
import org.apache.lucene.search.IndexSearcher 
import org.apache.lucene.search.ScoreDoc 
import org.apache.lucene.search.TermQuery 
import org.apache.lucene.store.RAMDirectory 
import org.apache.lucene.util.Version 
import org.apache.lucene.search.RegexpQuery 

public class Indexer { 
    private final Config config 
    private final String SCRIPT_PATH = "path" 
    private final String CONTENTS = "contents" 
    //Store the index in memory 
    private final RAMDirectory idx = new RAMDirectory() 
    def Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_48) 

    public Indexer(Config config) { 
     this.config = config; 
    } 
    //Save index to Memory 
    public indexScripts() { 
     IndexWriterConfig idxConfig = new IndexWriterConfig(Version.LUCENE_48, analyzer) 
     IndexWriter iwriter = new IndexWriter(idx, idxConfig) 

     //Traverse the folder and index both the file path and its contents 
     config.getScriptFolder().traverse { file -> 
      if (file.isFile()) { 
       Document doc = new Document() 
       String path = file.name 
       Field pathField = new StringField(SCRIPT_PATH, path, Field.Store.YES) 
       doc.add(pathField) 

       String content = file.text 
       doc.add(new StringField(CONTENTS, content, Field.Store.YES)) 
       println("Added file: " + file.name) 
       iwriter.addDocument(doc) 
      } 
     } 
     iwriter.close() 
    } 

    public ArrayList<String> searchIndex(String checkFor, boolean regEx = false) { 
     //Open a reader to the index in memory 
     def IndexReader indexReader = IndexReader.open(idx) 
     def IndexSearcher indexSearcher = new IndexSearcher(indexReader) 
     def ArrayList<String> results = new ArrayList<String>() 

     //Parse the query according to the string provided 
     if (!regEx) { 
      TermQuery query = new TermQuery(new Term(CONTENTS, checkFor)) 
      println query 
      ScoreDoc[] hits = indexSearcher.search(query, 400).scoreDocs 
      if (hits.length > 0) { 
       for (int i = 0; i < hits.length; i++) { 
        def Document hitDoc = indexSearcher.doc(hits[i].doc) 
        results.add(hitDoc.get(SCRIPT_PATH)) 
        return results 
       } 
      } 
      results = [] 
      return results 
     } else { 
      RegexpQuery query = new RegexpQuery(new Term(checkFor)) 
      ScoreDoc[] hits = indexSearcher.search(query, null, 400).scoreDocs 
      if (hits.size() != null) { 
       for (int i = 0; i < hits.length; i++) { 
        def Document hitDoc = indexSearcher.doc(hits[i].doc) 
        results.add(hitDoc.get(SCRIPT_PATH)) 
        return results 
       } 
      } 
      results = [] 
      return results 
     } 
     indexReader.close() 
    } 
} 

위의 코드는 나에게 0 결과를 제공합니다 :

다음은 I가 그렇게 작성 인덱서 클래스입니다. 문자열의 B_C_Patched 부분을 정확히 일치 시켜서 "="에서 문자열을 분리하고 첫 번째 부분을 checkFor 변수로 저장합니다.

피곤 다른 분석기 쿼리 파서를 가지고 모든

도와주세요 0을 반환)

답변

0

내 생각 : 당신이 StandardTokenizer을 사용하는 (StandardAnalyzer를 사용). 후자는 Unicode word boundaries을 사용하여 단어를 나눕니다. 그리고 문자열 (B_C_Patched)의 밑줄에는이 두 개가 있습니다.

색인을 생성하면 B, CPatched으로 분할됩니다. 그러나 TermQuery을 사용하여 쿼리를 구성하면 쿼리를 분석하지 않고 하나의 용어로 취급합니다. 이 문제를 해결하려면 QueryParser을 사용하고 contents:B_C_Patched으로 피드하십시오. 반환 된 쿼리는 다른 결과를 가져와야합니다.

+0

입력 해 주셔서 감사 드리며 다시 신고 해주세요. – Ferdi

+0

다시 thx 피드백에 대해,하지만 정말 필요한 것은 "B_C_Patched = File where patched"와 같이 키 값 쌍으로 문자열을 분할하지 않도록 색인을 생성하는 것입니다. 그래서 Field.index.NOT_ANALYZED가있는 indixing 부분에서 키워드 분석기를 사용했지만 아직 결과가 없습니다. 색인 부분에서 잘못된 분석기를 사용하고 있습니까? – Ferdi

+0

Sry가 위의 코멘트에서 언급하는 것을 잊어 버렸습니다. 정확한 일치를 원합니다 – Ferdi

관련 문제