Solr Query - Как исправить непредвиденный результат (возможно, специфический для конкретной культуры)? - PullRequest
2 голосов
/ 11 апреля 2019

Я переключил поисковик с lucene на solr в моем приложении sitecore.Есть несколько дополнений от sitecore к schema.xml от solr.Я использую Solr 6.6.3.Изменение было успешным, но некоторые результаты поиска не такие, как прежде.

Пример: поиск по немецкому слову "Trommelfilter" не вернет никаких результатов.Поиск по немецкому слову "Trommelfilt" возвращает ожидаемый результат.

Кажется, что "er" может быть удалено изнутри.Может быть, какая-то конкретная проблема культуры?

Я снова запускаю поиск solr, но проблема все еще существует.

Solr Query 1: searchcontent_t_de:(*Trommelfilt*) Результат:

{
  "responseHeader":{
    "status":0,
    "QTime":4,
    "params":{
      "q":"searchcontent_t_de:(*trommelfilt*)",
      "indent":"on",
      "wt":"json",
      "_":"1554983614349"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

Solr Query 2: searchcontent_t_de:(*Trommelfilter*) Результат:

{
  "responseHeader":{
    "status":0,
    "QTime":8,
    "params":{
      "q":"searchcontent_t_de:(*Trommelfilt*)",
      "indent":"on",
      "wt":"json",
      "_":"1554983656940"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        ...
        "_templatename":"Application",
        "culture_s":"de-DE",
        "_database":"master",
        "searchcontent_t_de":"... einen Trommelfilter gereinigt. ...",
        "_language":"de-DE",
        ...
}}

Ответственный код настроенной схемы в solr для затронутого ядра.Конфигурация для searchcontent_t_de осуществляется через dynamicField.

<dynamicField name="*_t_de" type="text_de" indexed="true" stored="true" />
...
<fieldType name="text_de" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball" />
        <filter class="solr.GermanNormalizationFilterFactory" />
        <filter class="solr.GermanLightStemFilterFactory" />
        <!-- less aggressive: <filter class="solr.GermanMinimalStemFilterFactory"/> -->
        <!-- more aggressive: <filter class="solr.SnowballPorterFilterFactory" language="German2"/> -->
      </analyzer>
</fieldType>

Я хочу знать, какое изменение мне нужно сделать, чтобы получить ожидаемый результат (полное слово должно быть найдено).

1 Ответ

2 голосов
/ 11 апреля 2019

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

По этой же причине вы не получаете попадания, так как при сохранении токенов присутствует фильтр стволовых - это удаляет окончание er из сохраненного токена.

С подстановочным знаком: В индексе: trommelfilt - в поиске: *trommelfilter*.Они не совпадают - поскольку сохраненный токен не имеет er, и при наличии подстановочных знаков удаление не происходит, поэтому совпадение не создается.

Если вы отбрасываете подстановочные знаки (т. Е. Ищите толькоtrommelfilter) вы получите удар, так как при индексации и запросах происходит одинаковая обработка.Строка запроса также будет обработана до trommelfilt, что соответствует токену trommelfilt в индексе.

...