Solr - настройка конфигурации поиска подстроки - PullRequest
0 голосов
/ 19 марта 2019

Я использую Solr 7.5, чтобы сделать некоторые предложения с "/ Suggester" по категориям. Это используется для функции автозаполнения с интеграцией Solr.

Проиндексированные объекты:

  • "Крыша"
  • "Панели крыши"
  • "Сэндвич-панели"

Ожидаемое поведение

Поиск: "roo" -> Результат: "Roof" & "Roof Panels"

Поиск "панель" -> Результат: "Панели крыши" и "Панели сэндвичей"

Проблемы

Я пробовал несколько решений с разными токенизаторами, но безуспешно.

StandardTokenizer возвращает отдельные слова

KeywordTokenizer возвращает мне полную фразу, но там у меня проблема, если я ищу «панель» -> нет предложенных слов. Ожидаются "сэндвич-панели" и "панели крыши"

ShingleFilterFactory выдает мне странные результаты, если я ищу «панель крыши» -> она возвращает «панели крыши» / «панели крыши» / «сэндвич-панели крыши»

Последняя конфигурация

Документ Solr:

"autosuggest_en":["Roof Panels",
      "Sandwich Panels",
      "Roof Panels",
      "Sandwich Panels"],

    "spellcheck_en":["Roof Panels",
      "Sandwich Panels",
      "Roof Panels",
      "Sandwich Panels"],

solrconfig.xml

<searchComponent name="suggest" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">text_spell</str>
    <lst name="spellchecker">
        <str name="name">default</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
        <str name="suggestAnalyzerFieldType">text_spell</str>
        <str name="field">autosuggest</str>
        <str name="buildOnCommit">true</str>
        <str name="buildOnOptimize">true</str>
        <str name="accuracy">0.35</str>
    </lst>
</searchComponent>

schema.xml

<fieldType name="text_spell" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" maxShingleSize="10"
                    outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" " fillerToken="_"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" maxShingleSize="10"
                    outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" " fillerToken="_"/>
        </analyzer>
    </fieldType>

Приведенное выше решение дает мне следующее поведение. поиск: "крыша" -> результаты: "крыша" & "панели крыши" = хорошо

поиск: "панель крыши" -> результаты: "панели крыши" и "панели крыши" = не хорошо. Не знаю, почему это дважды повторяет «крышу»

Какой-нибудь совет относительно правильного решения ожидаемого поведения?

Спасибо!

С уважением

1 Ответ

0 голосов
/ 19 марта 2019

Чтобы исследовать проблему, вы можете сделать следующие шаги:

  • Вам следует взглянуть на synonyms.txt Есть ли какие-либо идеи по содержанию?Если да, отключите этот файл для теста.

  • Используйте функцию analysis на своей странице администратора solr, чтобы узнать, как solr обрабатывает обработку вашего поискового запроса

...