2014-06-23 3 views
-1

Apache lucene을 사용하여 파일 내의 문자열을 검색하고 있습니다. 어떤 종류의 구문 분석 lucene 사용합니다. Obama를 검색하면 Presobama로 결과를 반환하지 않지만 # Obama에 대한 결과를 반환합니다. 아무도 그 이유를 말할 수 있습니까? TextField를 사용하고 있습니다.Apache Lucene을 사용하여 검색

  StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_44); 

     // Code to create the index 
     Directory index = new RAMDirectory(); 

     IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); 

     IndexWriter w = new IndexWriter(index, config); 
     addDoc(w, finalstep); 

     w.close(); 
        String querystr = search; 

     // The \"title\" arg specifies the default field to use when no field is explicitly specified in the query 
     Query q = new QueryParser(Version.LUCENE_44, "title", analyzer).parse(querystr); 

     // Searching code 
     int hitsPerPage = 10; 
     IndexReader reader = DirectoryReader.open(index); 
     IndexSearcher searcher = new IndexSearcher(reader); 
     TopScoreDocCollector collector = TopScoreDocCollector.create(hitsPerPage, true); 
     searcher.search(q, collector); 
     ScoreDoc[] hits = collector.topDocs().scoreDocs; 

답변

1

분석기는 텍스트가 토큰으로 분리되는 방법을 지정합니다. StandardAnalyzer을 사용 중입니다.

StandardAnalyzer은 일반적으로 스트림을 단어로 분리하려고했습니다. 이 작업을 수행하는 데 사용하는 규칙은 Unicode Standard Annex #29으로 전체적으로 지정되지만 대충 말하면 다음과 같습니다. 공백과 구두점으로 토큰을 구분합니다.

"#Obama"는 "obama"가됩니다. "#"은 분석에서 제거됩니다. "Presobama"는 "presobama"가됩니다. 현재 파싱 규칙은 "presobama"라는 용어에 대해 아무 것도 모르고 있으며, 하나 이상의 단어로 취급되어야한다고 결론을 내릴 이유가 없습니다.

더 가깝게 일치하는 방법에는 여러 가지가 있습니다. 몇 가지 가능성 : Wildcard queries을 사용하고 NGramTokenFilter을 사용하여 ngrams의 토큰을 색인화하거나 몇 가지 성가신 용어가있는 경우 SynonymFilter을 사용하여 동의어 대체를 지정할 수 있습니다.

관련 문제