Каковы лучшие практики для объединения анализаторов в Lucene? - PullRequest
3 голосов
/ 05 марта 2011

У меня ситуация, когда я использую StandardAnalyzer в Lucene для индексации текстовых строк следующим образом:

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>();
}

Может кто-нибудь сказать мне, как лучше всего добиться этого с кодом выше?

Спасибо

Мистер Морган.

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Lucene предоставляет базовый класс org.apache.lucene.analysis.Analyzer, который можно использовать, если вы хотите написать собственный анализатор.
Вы можете проверить org.apache.lucene.analysis.standard.StandardAnalyzer класс, расширяющий возможности Analyzer.

Затем в YourAnalyzer вы будете связывать StandardAnalyzer и SnowballAnalyzer, используя фильтры, используемые этими анализаторами, например:

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

Затем в существующем коде вы сможете создать IndexWriter с собственной реализацией Analyzer, которая объединяет фильтры Standard и Snowball.

Совершенно не по теме:
Я полагаю, вам в конечном итоге потребуется настроить свой собственный способ обработки запросов. Это уже реализовано внутри Solr.

Сначала напишите свой собственный поисковый компонент, расширив SearchComponent и определив его в SolrConfig.xml, например:

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

Затем напишите ваш обработчик поиска (обработчик запросов), расширив SearchHandler, и определите его в 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>

Затем, когда вы отправляете URL-запрос в Solr, просто включите дополнительный параметр qt = YourRequestHandlerName, который приведет к тому, что ваш обработчик запроса будет использоваться для этого запроса.

Подробнее о компонентах поиска.
Подробнее о RequestHandlers.

1 голос
/ 10 марта 2011

SnowballAnalyzer, предоставленный Lucene, уже использует StandardTokenizer, StandardFilter, LowerCaseFilter, StopFilter и SnowballFilter. Похоже, что он делает именно то, что вам нужно (все, что делает StandardAnalyzer, плюс снежный ком).

Если этого не произойдет, вы сможете довольно легко создать свой собственный анализатор, комбинируя любые токенизаторы и TokenStreams, которые вы пожелаете.

0 голосов
/ 12 марта 2011

В конце я изменил код программы, чтобы вызвать SnowBallAnalyzer в качестве опции. Выходные данные затем индексируются с помощью StandardAnalyzer.

Это работает и быстро, но если я смогу сделать все с помощью одного анализатора, я еще раз вернусь к своему коду.

Благодаря Мбоначи и Ави.

...