2011-05-03 4 views
3

Lucene 퍼지 검색을 사용할 때 어떻게 일치하는 퍼지 항목과 그 오프셋을 얻습니까?Lucene Fuzzy 검색 결과 일치하는 용어를 얻는 방법?

IndexSearcher mem = ....(some standard code) 

    QueryParser parser = new QueryParser(Version.LUCENE_30, CONTENT_FIELD, analyzer); 

    TopDocs topDocs = mem.search(parser.parse("wuzzy~"), 1); 
    // the ~ triggers the fuzzy search as per "Lucene In Action" 

퍼지 검색이 정상적으로 작동합니다. 문서에 "퍼지"또는 "희미한"용어가 포함되어 있으면 일치합니다. 일치하는 용어와 오프셋은 무엇입니까?

모든 CONTENT_FIELD에 위치 및 오프셋이있는 termVectorStored가 추가되었는지 확인했습니다.

+1

를 구현하는 클래스를 만드시겠습니까? http://lucene.apache.org/java/3_0_0/api/contrib-highlighter/index.html – Jared

+0

아니요. 텍스트를 강조 표시하지 않으려 고합니다. 추가 텍스트 처리가 필요합니다. 추가 텍스트 처리를하기 전에, 퍼지 (fuzzy) 매치이므로 "퍼지 (fuzzy)"또는 "퍼지 (whuzzy)"등의 용어가 일치하는지 파악해야합니다. – user193116

답변

6

Jared의 제안을 재검토하고 솔루션을 작동시킬 수 있었던 방법은 없었습니다.

누군가 다른 사람에게 동일한 문제가있는 경우를 대비하여 여기에 설명하고 있습니다.

당신이이 라인을 따라 뭔가를 찾고 계십니까 org.apache.lucene.search.highlight.Formatter

public class HitPositionCollector implements Formatter 
{ 
    // MatchOffset is a simple DTO 
    private List<MatchOffset> matchList; 
    public HitPositionCollector(
    { 
     matchList = new ArrayList<MatchOffset>(); 
    } 

    // this ie where the term start and end offset as well as the actual term is captured 
    @Override 
    public String highlightTerm(String originalText, TokenGroup tokenGroup) 
    { 
     if (tokenGroup.getTotalScore() <= 0) 
     { 
     } 
     else 
     { 
      MatchOffset mo= new MatchOffset(tokenGroup.getToken(0).toString(), tokenGroup.getStartOffset(),tokenGroup.getEndOffset()); 
      getMatchList().add(mo); 
     } 

     return originalText; 
    } 

    /** 
    * @return the matchList 
    */ 
    public List<MatchOffset> getMatchList() 
    { 
     return matchList; 
    } 
} 

홈페이지 코드

public void testHitsWithHitPositionCollector() throws Exception 
{ 
    System.out.println(" .... testHitsWithHitPositionCollector"); 
    String fuzzyStr = "bro*"; 

    QueryParser parser = new QueryParser(Version.LUCENE_30, "f", analyzer); 
    Query fzyQry = parser.parse(fuzzyStr); 
    TopDocs hits = searcher.search(fzyQry, 10); 

    QueryScorer scorer = new QueryScorer(fzyQry, "f"); 

    HitPositionCollector myFormatter= new HitPositionCollector(); 

    //Highlighter(Formatter formatter, Scorer fragmentScorer) 
    Highlighter highlighter = new Highlighter(myFormatter,scorer); 
    highlighter.setTextFragmenter(
     new SimpleSpanFragmenter(scorer) 
    ); 

    Analyzer analyzer2 = new SimpleAnalyzer(); 

    int loopIndex=0; 
    //for (ScoreDoc sd : hits.scoreDocs) { 
     Document doc = searcher.doc(hits.scoreDocs[0].doc); 
     String title = doc.get("f"); 

     TokenStream stream = TokenSources.getAnyTokenStream(searcher.getIndexReader(), 
            hits.scoreDocs[0].doc, 
            "f", 
            doc, 
            analyzer2); 

     String fragment = highlighter.getBestFragment(stream, title); 

     System.out.println(fragment); 
     assertEquals("the quick brown fox jumps over the lazy dog", fragment); 
     MatchOffset mo= myFormatter.getMatchList().get(loopIndex++); 

     assertTrue(mo.getEndPos()==15); 
     assertTrue(mo.getStartPos()==10); 
     assertTrue(mo.getToken().equals("brown")); 
} 
+0

이것은 약간의 _hackish_ (느낌이 아니라, 더 깨끗한 방법이 있어야한다고 느낀다.)이게 내가 찾은 유일한 구현이다. 고맙습니다! –

관련 문제