остановить файл synonyms.txt от Solr

В файле synonyms.txt у меня есть запись marine => saltwater,marine, но оба слова сводятся к 'saltwat', 'marin' соответственно, несмотря на то, что они находятся в файле защищенных слов. Есть ли способ избежать этого?

схема.xml

 <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" analyzer="org.apache.lucene.analysis.en.EnglishAnalyzer" />
    </analyzer>
  </fieldType>

синонимы.txt

marine => saltwater,marine

protwords.txt

saltwater
marine

теперь, когда я делаю анализ в панели администратора и запрашиваю saltwat, появляется saltwat | marin. что означает, что соленая вода была привязана к saltwat в файле synonyms.txt saltwat | marin


person raj247    schedule 14.11.2017    source источник
comment
поделитесь своим schema.xml для этого поля   -  person Mysterion    schedule 14.11.2017


Ответы (2)


Анализ solr работает в той же последовательности, в которой вы объявляете его в своем определении fieldType в схеме. Таким образом, если вы объявите какой-либо фильтр Stem после фильтра Synonyms, он будет применяться после изменения синонимов. Если вы этого не хотите, SynonymsFilter следует настроить после StemFilter, например:

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt" />
      <filter class="solr.ASCIIFoldingFilterFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
      <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
      <filter class="solr.CommonGramsFilterFactory" words="lang/stopwords_en.txt" ignoreCase="true"/>
      <filter class="solr.PorterStemFilterFactory"/>
      <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
    </analyzer>
  </fieldType>

Я рекомендую вам проверить инструмент Solr Analysis в вашем Solr Admin. чтобы проверить, что происходит с вашим полем как во время индексации, так и во время запроса.

Пожалуйста, поделитесь своей схемой, если вам нужна дополнительная помощь.

person Alessandro Hoss    schedule 15.11.2017
comment
Я добавил все необходимые файлы. Пожалуйста, посмотрите. - person raj247; 16.11.2017
comment
Это потому, что вы используете org.apache.lucene.analysis.en.EnglishAnalyzer в конфигурации фильтра синонимов. Он также отвечает за применение стемминга. Попробуйте удалить анализатор из конфигурации фильтра синонимов (я обновил ответ, чтобы он соответствовал вашей конфигурации). - person Alessandro Hoss; 16.11.2017
comment
Да, английский анализатор необходим, так как он обрабатывает много входных данных, НО я вижу, что в lucene.apache.org/core/4_4_0/analyzers-common/org/apache/lucene/ есть ли способ использовать третий в моей схеме, в которую я могу передать StemExclusionSet, чтобы слова не попадали в synonyms.txt - person raj247; 17.11.2017
comment
Похоже, в настоящее время вы не можете изменить конфигурацию анализатора: lucene.472066.n3.nabble.com/. Что вы можете сделать, так это создать свой собственный анализатор, упаковать его как пользовательскую библиотеку в solr и указать его в своей конфигурации синонима. В этом случае вы можете просто расширить EnglishAnalyser и настроить то, что вы хотите изменить. НО.. Вы уверены, что вам действительно нужно анализировать синонимы? - person Alessandro Hoss; 17.11.2017
comment
Да, мне нужно проанализировать синонимы, так как я не хочу вводить множественное число для всех записей в моем файле синонимов. что вы подразумеваете под упаковкой как пользовательская библиотека в solr? - person raj247; 17.11.2017
comment
Я имею в виду, что вы можете написать свой собственный анализатор... Я еще не делал этого с анализатором, но в теории это примерно так: напишите свой java-класс, который расширяет EnglishAnalyser и вызывает нужный вам конструктор, упакуйте его в банку файл, включите этот jar-файл в папку solr contrib, укажите этот jar-файл как ‹lib /› в файле solrconfig.xml и укажите ссылку на класс вашего анализатора (полное имя класса) в конфигурации synonymFilter. - person Alessandro Hoss; 17.11.2017

Протослова (защищенные слова) — это слова, которые будут выделены с помощью стеммера английского портера, а вы не хотите, чтобы они были выделены.

Пользовательский список защищенных слов может быть указан с помощью атрибута «защищено» в схеме. Любые слова в списке защищенных слов не будут изменены никаким стеммером в Solr.

<fieldtype name="myfieldtype" class="solr.TextField">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt" />
    <filter class="solr.PorterStemFilterFactory" />
  </analyzer>
</fieldtype>
person Oyeme    schedule 14.11.2017
comment
Я добавил все необходимые файлы. Пожалуйста, посмотрите. - person raj247; 16.11.2017