Solr выделение разрывов, когда qf и hl.fl отличаются - PullRequest
1 голос
/ 28 мая 2019

Я ищу запрос, скажем "nurses" в некоторых полях копирования a_cpy,b_cpy,c_cpy, которые являются копиями поля a,b,c соответственно.

Значения, проиндексированные в поле a,b,c, основаны на значениях в a_cpy,b_cpy,c_cpy не остановлены.

Мое hl.fl значение равно a,b,c, а qf равно a_cpy,b_cpy,c_cpy and hl.q и равно "nurses".

Ответ от solr не выделяет "nurses", но выделяет правильный, когда поисковый термин "nurse".

Это ожидаемое поведение или что-то не так с моим методом?

1 Ответ

1 голос
/ 29 мая 2019

Как вы уже упоминали, у одного поля есть фильтр стволов, а у другого поля нет основ.

Чтобы ответить на ваш вопрос, это правильное поведение, и с ним все в порядке.На следующем примере мы увидим, почему это происходит, используя анализ solr.

Для поля с именем text будет использоваться тип поля ниже, который не имеет фабрики фильтра стволов.

<field name="text" type="text_general"/>

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

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

SOlr analysis without stemming Это не соответствует, потому что индексированные данные(токены, созданные в конце фабрики фильтров) отличается от значения запроса.

Для поля с именем text_copy_stemmed будет использоваться тип поля ниже, который имеет фабрику фильтра стволов.При индексации мы использовали <filter class="solr.KStemFilterFactory"/>.

<field name="text_copy_stemmed" type="text_general_stemmed"/>

<copyField source="text" dest="text_copy_stemmed" indexed="true" stored="true"/>

<fieldType name="text_general_stemmed" class="solr.TextField" positionIncrementGap="100" multiValued="true">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.KStemFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

Когда вы проанализируете данные для указанного выше поля text_copy_stemmed на странице анализа solr, вы обнаружите, что оно действительно соответствует данным.

Solr analysis with stemming

Запрашиваемые данные сопоставляются, поскольку они находят токен в solr.Проверьте токены, созданные в конце фабрики фильтров, и те, которые прошли через запрос.

Я проиндексировал приведенный ниже JSON и запросил те же данные с выделением.

{
"id":"gb18030-example.xml",
"text":"jump jumping jumped organizational organizations",
"text_copy_stemmed":"jump jumping jumped organizational organizations"
}

solr highlight with normal word

solr highlight with stemmed word

Solr highlight with non stemmed

Solr highlight with non stemmed word

Solr highlight with no response

...