Multi Phrase Query не находит мои документы - PullRequest
0 голосов
/ 22 января 2019

В рамках плана обновления с версии 6.2.1 я настраиваю новый Solr (7.6.0). Удивительно, но один из наших простых тестов не удался - вставил документ с текстом, а затем попытался найти его.

Текст, который был вставлен:

Я подумаю об этом.

Запрос конфигурации обработчика:

<requestHandler name="/select" class="solr.SearchHandler">    
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">20</int>
       <str name="df">text_en</str>
       <str name="hl.fragsize">100000</str>
       <str name="hl.maxAnalyzedChars">100000</str>
     </lst>
</requestHandler>

Вот как настроено поле:

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


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

"будет" и "это" появится в файле stopwords_en.txt.

Согласно Анализу в Admin Web App, это окончательные токены, которые вставляются в индекс:

text:     i i_will will_think think about about_it  
position: 1    1       2        3     4      4

Поиск по text_en:"I will think about it" не находит документ.

Странно то, что запрос "I will think think about it" работает ...

Используя debugQuery , я заметил разницу по сравнению с нашей текущей версией.
6.2.1 использует MultiPhraseQuery
7.6.0 использует SpanNearQuery

В версии 6.2.1:

"rawquerystring":"text_en:\"I will think about it\"",
    "querystring":"text_en:\"I will think about it\"",
    "parsedquery":"MultiPhraseQuery(text_en:\"(i i_will) will_think think (about about_it)\")", ...

В 7.6.0 (кстати, также в 7.5.0):

"rawquerystring":"text_en:\"I will think about it\"",
    "querystring":"text_en:\"I will think about it\"",
    "parsedquery":"SpanNearQuery(spanNear([spanOr([spanNear([text_en:i, text_en:will_think], 0, true), spanNear([text_en:i_will, text_en:think], 0, true)]), text_en:about_it], 0, true))", ...

1 Ответ

0 голосов
/ 29 января 2019

Я нашел виновника.
Делитесь им, чтобы поддержать будущих гуглеров.
Произошла ошибка в конфигурации поля в файле schema.xml.
В анализаторе «запрос» вместо «CommonGramsFilterFactory» это должно быть «CommonGrams Query FilterFactory».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...