2016-10-07 15 views
0

Если я правильно понимаю, SynonymFilterFactory никак не связывает синонимы. Таким образом, нужно было бы быть достаточно исчерпывающим с множественными числами и временными в их файле синонимов, если они хотят хорошего отзыва, независимо от плюрализации/tensing.SOLR: SynonymFilterFactory с прерыванием

Я вижу, что SynonymFilterFactory имеет необязательный аргумент, где он может принимать анализатор.

анализатор: (необязательно; по умолчанию: WhitespaceTokenizerFactory) Имя класса анализатора, используемого при анализе файла синонимов. Если указан анализатор, то токензаторFactory может и не быть, и наоборот.

Я сомневаюсь, что гнездятся нужный анализатор, как так действует:

<analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.SnowballPorterFilterFactory" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" > 
     <analyzer> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
      <filter class="solr.LowerCaseFilterFactory" /> 
      <filter class="solr.SnowballPorterFilterFactory" /> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
     </analyzer> 
    </filter> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
</analyzer> 

Я подозреваю, что компиляция анализатора расширение .jar и поместить его в Lib папки в Solr может быть единственным способом сделать это. Есть ли способ определить именованный анализатор в конфигурации или другой метод для достижения этой цели?

ответ

0

Это не отвечает на мой первоначальный вопрос (о том, как это сделать с помощью конфигурации), но это решение, в результате которого я использовал его, если кто-то еще захочет это сделать.

Во-первых, пользовательский анализатор, который будет использоваться для предварительной обработки синонимов, поступающие из синонима фильтра (что наиболее важно, вытекающие их с Snowball):

public class SnowballAnalyzer extends Analyzer { 
    /** 
    * Creates a 
    * {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} which 
    * tokenizes text when given a reader. 
    * 
    * @return A 
    *   {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} 
    *   built from an {@link WhitespaceTokenizer} filtered with 
    *   {@link LowerCaseFilter} and English {@link SnowballFilter}. 
    */ 
    @Override 
    protected TokenStreamComponents createComponents(String fieldName) { 
     Tokenizer source = new WhitespaceTokenizer(); 
     TokenStream filter = new LowerCaseFilter(source); 
     filter = new SnowballFilter(filter, "English"); 
     return new TokenStreamComponents(source, filter); 
    } 

} 

Это извлекается как .jar и развернутый в вашем каталоге lib для SOLR home. Далее, убедитесь, что сказать SOLR использовать этот анализатор в вашем синониме фильтре (обычно в schema.xml или управляемая схема):

<fieldType name="stemmedText" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory"/> 
     <filter class="solr.SynonymFilterFactory" expand="true" analyzer="your.package.SnowballAnalyzer" ignoreCase="true" synonyms="synonyms.txt"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

И, наконец, используя указанный тип на любые поля, которые вы хотите:

В этом примере поля ключевых слов документов будут отмечены в индексе. Когда запрос будет выполнен в этом поле, этот термин будет зависеть от , а затем используется для поиска синонимов (которые уже предустановлены пользовательским анализатором). В результате синонимный файл, содержащий «неполный» список синонимов (множественное число, времена), имеет гораздо более высокий шанс получить совпадение.

Конкретный пример

запись Синоним файла: [собака, собачка, собаки, собачьи, псовых, щенок, щенки, щенок]

поиска: щенки (обратите внимание, что это не в списке синонимов)

Parsed query: SynonymQuery (синоним (ключевые слова: ключевые слова: ключевые слова для собак: ключевые слова для собак: щенки ключевые слова: puppi))