2012-12-04 2 views
3

Webmethods 응용 프로그램에서 검색 기능을 구현해야하는데 Lucene을 사용했습니다. 그러나 alpabet.for와 같은 다른 제목으로 끝나는 제목을 가진 파일을 검색 할 때 검색 결과를 검색하지 않습니다. - doc1.txt 또는 new $ .txt
아래 코드에서 을 인쇄하려고하면 아래의 코드가 인쇄됩니다. 인쇄 검색 결과 >>>>>>> title : "doc1 txt"(내용 : doc1 내용 : txt). doc.txt와 같은 문자열을 검색하면 검색 결과는 >>>>>>> title : " doc.txt "내용 : doc.txt. 이러한 종류의 문자열 (doc1.txt, new $ .txt 등)을 파싱하려면 어떻게해야합니까?알파벳이 아닌 문자로 끝나는 Lucene 텍스트 검색이 없습니다.

public java.util.ArrayList<DocNames> searchIndex(String querystr, 
       String path, StandardAnalyzer analyzer) { 
      String FIELD_CONTENTS = "contents"; 
      String FIELD_TITLE = "title"; 
      String queryStringCmbd = null; 

      queryStringCmbd = new String(); 

      String queryFinal = new String(querystr.replaceAll(" ", " AND ")); 
      queryStringCmbd = FIELD_TITLE + ":\"" + queryFinal + "\" OR " 
        + queryFinal; 


      try { 

       FSDirectory directory = FSDirectory.open(new File(path)); 

       Query q = new QueryParser(Version.LUCENE_36, FIELD_CONTENTS, 
         analyzer).parse(querystr); 

       Query queryCmbd = new QueryParser(Version.LUCENE_36, 
         FIELD_CONTENTS, analyzer).parse(queryStringCmbd); 

       int hitsPerPage = 10; 
       IndexReader indexReader = IndexReader.open(directory); 
       IndexSearcher indexSearcher = new IndexSearcher(indexReader); 

       TopScoreDocCollector collector = TopScoreDocCollector.create(
         hitsPerPage, true); 
       indexSearcher.search(queryCmbd, collector); 
       ScoreDoc[] hits = collector.topDocs().scoreDocs; 

       System.out 
         .println("Search Results>>>>>>>>>>>>" 
           + queryCmbd); 

       docNames = new ArrayList<DocNames>(); 
       for (int i = 0; i < hits.length; ++i) { 
        int docId = hits[i].doc; 
        Document d = indexSearcher.doc(docId); 
        DocNames doc = new DocNames(); 
        doc.setIndex(i + 1); 
        doc.setDocName(d.get("title")); 
        doc.setDocPath(d.get("path")); 
        if (!(d.get("path").contains("indexDirectory"))) { 
         docNames.add(doc); 
        } 
       } 

       indexReader.flush(); 
       indexReader.close(); 
       indexSearcher.close(); 
       return docNames; 
      } catch (CorruptIndexException e) { 
       closeIndex(analyzer); 
       e.printStackTrace(); 
       return null; 
      } catch (IOException e) { 
       closeIndex(analyzer); 
       e.printStackTrace(); 
       return null; 
      } catch (ParseException e) { 
       closeIndex(analyzer); 
       e.printStackTrace(); 
       return null; 
      } 
     } 

답변

2

귀하의 문제는 당신이 StandardAnalyzer을 사용하고있는 사실에서 비롯됩니다. javadoc을 읽으면 토큰 분할에 StandardTokenizer을 사용하고 있음을 알립니다. 즉, doc1.txt과 같은 문구는 doc1txt으로 나뉩니다.

전체 텍스트를 일치 시키려면 색인 생성 및 검색에 모두 KeywordAnalyzer - 을 사용해야합니다. 아래 코드는 차이점을 표시합니다. StandardAnalyzer 토큰을 사용하는 경우 {"doc1", "txt"}이고 KeywordAnalyzer을 사용하는 경우 유일한 토큰은 doc1.txt입니다.

String foo = "foo:doc1.txt"; 
    StandardAnalyzer sa = new StandardAnalyzer(Version.LUCENE_34); 
    TokenStream tokenStream = sa.tokenStream("foo", new StringReader(foo)); 
    while (tokenStream.incrementToken()) { 
     System.out.println(tokenStream.getAttribute(TermAttribute.class).term()); 
    } 

    System.out.println("-------------"); 

    KeywordAnalyzer ka = new KeywordAnalyzer(); 
    TokenStream tokenStream2 = ka.tokenStream("foo", new StringReader(foo)); 
    while (tokenStream2.incrementToken()) { 
     System.out.println(tokenStream2.getAttribute(TermAttribute.class).term()); 
    } 
+0

정말 고맙습니다. 그러나 KeywordAnalyzer를 사용하여 'X X X X X X X X X X X'또는 공백이 포함 된 검색 문자열의 경우 파일을 찾을 수 있습니까? 시도했지만 결과를 얻지 못했습니다? 그런 경우에는 무엇을 할 수 있습니까? 친절하게 도와주세요 – Cheese

+0

자세한 내용을 입력해야합니다. 가장 좋은 방법은 새 질문을 열고 코드를 보여주는 것입니다. 또한이 대답이 도움이 되었다면, 당신이 그것을 받아들이기를 원할 수도 있습니다. 그렇지 않으면 사람들이 대답을 제공하는 것을 멈 춥니 다. – mindas

관련 문제