2013-09-30 72 views
0

我想以編程方式在Lucene中使用DoubleMetaphone。在Lucene中使用DoubleMetaphoneFilter進行過濾

<dependency> 
      <groupId>org.apache.lucene</groupId> 
      <artifactId>lucene-analyzers-phonetic</artifactId> 
      <version>4.4.0</version> 
</dependency> 

上面的軟件包包含適當的類。

此過濾器可以通過設置xml在Solr中使用。

但我希望它在Java programmaticaly中使用。

analyzer = new StandardAnalyzer(Version.LUCENE_44); 
String field = "title"; 
Query q = new QueryParser(Version.LUCENE_44, field, analyzer).parse(querystr); 
int hitsPerPage = 100; 
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; 

但我不知道如何使用過濾器。

回答

0

要使用此過濾器,您需要創建自己的自定義分析器,類似於Analyzer documentation中的示例。如果你想添加一個metaphone過濾器到

Analyzer analyzer = new Analyzer() { 
    @Override 
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) { 
     final StandardTokenizer source = new StandardTokenizer(Version.LUCENE_44, reader); 
     source.setMaxTokenLength(StandardAnalyzer.DEFAULT_MAX_TOKEN_LENGTH); 
     TokenStream filter = new StandardFilter(Version.LUCENE_44, filter); 
     filter = new LowerCaseFilter(Version.LUCENE_44, filter); 
     filter = new StopFilter(Version.LUCENE_44, filter, StopAnalyzer.ENGLISH_STOP_WORDS_SET); 
     filter = new DoubleMetaphoneFilter(filter, 4, true); 
     return new TokenStreamComponents(source, filter) 
    } 
} 

這當然只是一個例子。然而,設置你的分析器對於你想索引的數據是有意義的。

另外,請記住,此過濾器將需要應用於索引時間以及查詢時間,因此您需要重新索引您的數據,並將此過濾器應用於索引metaphone代碼。