2015-10-20 2 views
7

Я сконфигурировал solr 4.10 (также 5.3) с highlighting functionality. Он отлично работает с большинством слов, однако я нашел несколько слов, которые «не» позволяют выделять, т. Е. Solr возвращает требуемые документы, но не выделяет некоторые из них.Solr не выделяет некоторые слова

Что может вызвать такой эффект?

solrconfig.xml

<requestHandler name="/select" class="solr.SearchHandler"> 
<lst name="defaults"> 
    <str name="wt">json</str> 
    <str name="indent">true</str> 
    <str name="defType">edismax</str> 
    <str name="bf">product(concount)</str> 
    <str name="df">text bio text_syn text_syn_other</str> 
    <str name="qf"> 
    text^25 bio^16 text_syn^8 text_syn_other^3 
    </str> 
    <str name="hl">on</str> 
    <str name="hl.fl">text bio text_syn text_syn_other</str> 
    <str name="hl.preserveMulti">true</str> 
    <str name="hl.encoder">html</str> 
    <str name="f.text.hl.fragsize">100</str> 
    <str name="hl.snippets">20</str> 
    <arr name="components"> 
    <str>highlight</str> 
    </arr> 
</lst> 

schema.xml

<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_abbr.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en_syn" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<fieldType name="text_en_syn_other" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_other.txt" ignoreCase="true" expand="false"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\\]" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EnglishPossessiveFilterFactory"/> 
    <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
    <filter class="solr.PorterStemFilterFactory"/> 
    </analyzer> 
</fieldType> 

<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" /> 
<field name="text_syn" type="text_en_syn" indexed="true" stored="false" multiValued="true" /> 
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="false" multiValued="true" /> 

<field name="text_exact" type="string" indexed="true" stored="false" multiValued="false" /> 

<field name="bio" type="text_en" indexed="true" stored="true" multiValued="false" /> 

<field name="bio_exact" type="string" indexed="true" stored="false" multiValued="false" /> 

<field name="concount" type="long" indexed="true" stored="true" multiValued="false" /> 

<field name="concount_exact" type="long" indexed="true" stored="false" multiValued="false" /> 

<copyField source="text" dest="text_syn"/> 
<copyField source="bio" dest="text_syn"/> 
<copyField source="text" dest="text_syn_other"/> 
<copyField source="bio" dest="text_syn_other"/> 

Для запроса http://localhost:8983/solr/select?q=senior я получил документы, содержащие слово senior, но выделив часть ответа Solr это слово не выделены.


UPDATE 1: Я считаю, что у меня есть слово senior в моем synonyms_abbr.txt файле, линия senior,lead. Когда я прокомментировал эту строку или заменил слова слов, lead,senior, удивительно, что слово senior начало выделяться. Есть идеи ?


UPDATE 2: Слова из synonyms.txt и synonyms_other.txt получают подсветка нормально, но слова из synonyms_abbr.txt ведут себя странно следующим образом. Например, у меня есть строка lead,head,senior в synonyms_abbr.txt затем

  • запросы http://localhost:8983/solr/select?q=senior и http://localhost:8983/solr/select?q=head не выделяет ни слова,
  • запросе http://localhost:8983/solr/select?q=lead подчеркивает не только слово lead, но и head и senior.
+0

Пожалуйста, используйте функциональные возможности Solr для анализа преобразования слова. Я не уверен, как изменилось это слово. Это может быть проблемой. В противном случае используйте другое поле, отключите преобразования, оставив только токенизатор, затем попробуйте выделить из этого поля. – 0xCAFEBABE

+0

@Mher Являются ли слова, которые не выделяются, останавливают слова? Или просто случайно? –

+0

У меня нет конфигураций стоп-кодов. Весь файл 'stopwords.txt' комментируется. – Mher

ответ

2

С вашего UPDATE2 ясно, что только первое слово среди lead,head,senior фактически используется для сопоставление синонимов и выделение.

Если посмотреть на Документах на SolrWiki https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters есть упоминание о expand=true, имеющих определенный эффект

синонимами имена параметров внешнего файла определения синонимов. Если ignoreCase имеет значение true, совпадение будет вестись в нижнем регистре перед проверкой равенства. Если расширение истинно, синоним будет расширен до всех эквивалентных синонимов. Если оно ложно, все эквивалентные синонимы будут сведены к первому в списке.

На сайте также представлены и пример

# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping: 
ipod, i-pod, i pod => ipod, i-pod, i pod 
# If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping: 
ipod, i-pod, i pod => ipod 

Это, кажется, согласуется с поведением вы наблюдаете. Это означает, что вы должны изменить определение фильтров синонимов в schema.xml, чтобы использовать expand = true ИЛИ изменить способ, которым ваш файл синонимов определяет фильтр для использования явного сопоставления.

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

+0

спасибо за объяснение, это очень полезно, можете ли вы объяснить другую часть вопроса: это, например, у нас есть 'expand = true', почему, когда я запрашиваю синонимы из файла' synonyms_abbr.txt', тогда все синонимы этого слова получаются изюминкой, а также самим собой, но, тем не менее, вы выбираете синоним из 'synonyms.txt', тогда подсветка получает только это слово, а не синонимы этого слова? – Mher

+0

Если вы посмотрите на определение своего поля, то поля, связанные с synonym.txt, настроены с помощью store = false. Поэтому подсветка не будет работать. См. Другой ответ на этот вопрос от ilinca – vvs

2

Некоторые поля не сохраняются, поэтому их невозможно вернуть. Поскольку они индексируются, они доступны для поиска. Измените свою схему, чтобы сохранить = "true" для всех полей, которые вы хотите выделить.

<field name="text_syn" type="text_en_syn" indexed="true" stored="true" multiValued="true" /> 
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="true" multiValued="true" /> 

Посмотрев на свою конфигурацию, я предполагаю, что вы выделите работы над полями bio и text?

+0

no @linca, подсветка не работает только по полям bio и text. Я не рассматриваю нити, которые не хранятся. – Mher

+0

О, извините. Строка text bio text_syn text_syn_other заставляла меня думать, что вы хотите выделить также два неработающих поля. Я думаю, нам понадобится пример значений полей, запроса, результата. – ilinca

0

Не могли бы вы попробовать добавить старший, свинец и свинец, старший в файл synonyms_abbr.txt, а затем попытаться запустить фломастер

Смежные вопросы