3

我有一种情况,我在 Lucene 中使用 StandardAnalyzer 来索引文本字符串,如下所示:

public void indexText(String suffix, boolean includeStopWords)  {        
    StandardAnalyzer analyzer = null;


    if (includeStopWords) {
        analyzer = new StandardAnalyzer(Version.LUCENE_30);
    }
    else {

        // Get Stop_Words to exclude them.
        Set<String> stopWords = (Set<String>) Stop_Word_Listener.getStopWords();      
        analyzer = new StandardAnalyzer(Version.LUCENE_30, stopWords);
    }

    try {

        // Index text.
        Directory index = new RAMDirectory();
        IndexWriter w = new IndexWriter(index, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);            
        this.addTextToIndex(w, this.getTextToIndex());
        w.close();

        // Read index.
        IndexReader ir = IndexReader.open(index);
        Text_TermVectorMapper ttvm = new Text_TermVectorMapper();

        int docId = 0;

        ir.getTermFreqVector(docId, PropertiesFile.getProperty(text), ttvm);

        // Set output.
        this.setWordFrequencies(ttvm.getWordFrequencies());
        w.close();
    }
    catch(Exception ex) {
        logger.error("Error message\n", ex);
    }
}

private void addTextToIndex(IndexWriter w, String value) throws IOException {
    Document doc = new Document();
    doc.add(new Field(text), value, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
    w.addDocument(doc);
}

效果很好,但我也想将它与使用 SnowballAnalyzer 的词干结合起来。

这个类还有两个实例变量,显示在下面的构造函数中:

public Text_Indexer(String textToIndex) {
    this.textToIndex = textToIndex;
    this.wordFrequencies = new HashMap<String, Integer>();
}

谁能告诉我如何使用上面的代码最好地实现这一目标?

谢谢

摩根先生。

4

3 回答 3

2

org.apache.lucene.analysis.Analyzer如果您想编写自己的分析器,Lucene 提供了可以使用的基类。
您可以查看org.apache.lucene.analysis.standard.StandardAnalyzer扩展 Analyzer 的类。

然后,在 YourAnalyzer 中,您将使用分析器使用的过滤器链接 StandardAnalyzer 和 SnowballAnalyzer,如下所示:

TokenStream result = new StandardFilter(tokenStream);
result = new SnowballFilter(result, stopSet);

然后,在您现有的代码中,您将能够使用您自己的链接标准和雪球过滤器的分析器实现来构造 IndexWriter。

完全题外话:
我想你最终需要设置处理请求的自定义方式。这已经在 Solr 内部实现了。

首先通过扩展 SearchComponent 并在 SolrConfig.xml 中定义它来编写自己的搜索组件,如下所示:

<searchComponent name="yourQueryComponent" class="org.apache.solr.handler.component.YourQueryComponent"/>

然后通过扩展 SearchHandler 来编写你的 Search Handler(请求处理程序),并在 SolrConfig.xml 中定义它:

  <requestHandler name="YourRequestHandlerName" class="org.apache.solr.handler.component.YourRequestHandler" default="true">
    <!-- default values for query parameters -->
        <lst name="defaults">
            <str name="echoParams">explicit</str>       
            <int name="rows">1000</int>
            <str name="fl">*</str>
            <str name="version">2.1</str>
        </lst>

        <arr name="components">
            <str>yourQueryComponent</str>
            <str>facet</str>
            <str>mlt</str>
            <str>highlight</str>            
            <str>stats</str>
            <str>debug</str>

        </arr>

  </requestHandler>

然后,当您向 Solr 发送 url 查询时,只需包含附加参数 qt=YourRequestHandlerName,这将导致您的请求处理程序用于该请求。

更多关于 SearchComponents。
更多关于 RequestHandlers。

于 2011-03-09T16:41:23.557 回答
1

Lucene 提供的 SnowballAnalyzer 已经使用了 StandardTokenizer、StandardFilter、LowerCaseFilter、StopFilter 和 SnowballFilter。所以听起来它完全符合您的要求(StandardAnalyzer 所做的一切,加上雪球词干)。

如果没有,您可以通过组合您希望的任何标记器和 TokenStreams 轻松构建自己的分析器。

于 2011-03-10T12:37:25.227 回答
0

最后,我重新安排了程序代码以调用 SnowBallAnalyzer 作为选项。然后通过 StandardAnalyzer 对输出进行索引。

它可以工作而且速度很快,但如果我只用一台分析器就能完成所有工作,我将重新审视我的代码。

感谢 mbonaci 和 Avi。

于 2011-03-12T10:31:07.187 回答