Почему поисковая система Solr веб-приложения возвращает результаты «Java Spring» при поиске «Spring Fertility»?Как можно это исправить? - PullRequest
2 голосов
/ 15 мая 2019

На самом деле у нас нет движка Solr или Lucene для этого веб-приложения. Мы заметили следующие две проблемы в веб-приложении. Как это исправить?

1) Когда пользователь выполняет поиск по термину «Java Spring», показанные результаты включают «Плодородие весны» и т. Д.? Я думаю, что сейчас поисковая система, работающая за веб-приложением, выполняет текстовый / семантический поиск. Как включить контекстный поиск (я придумал термин контекстный поиск на лету, не уверен, существует ли он), когда пользователь ищет технический термин «java Spring», он не включает результаты, такие как «весенний сезон» или "железная пружина".

2) Вторая проблема, которую я заметил, заключается в том, что если мы ищем «TeslaLLC», результаты не возвращаются. Но если мы изменим поисковый термин как «Tesla LLC» (с пробелом), он вернет значения. Как это исправить? (Похоже, что значение, которое они вводили в систему, было "Tesla LLC" (с пробелом). Но пользователь может печатать с пробелами или без них, и, по моему мнению, поисковая система должна обрабатывать оба.

Мы знали, что используются технологии Solr и Lucene. Так что, если вы могли бы посоветовать на основе технологии, это было бы полезно.

1 Ответ

4 голосов
/ 15 мая 2019

Все зависит от того, как вы индексируете поля.Какие типы полей используются для поля.Имеют ли типы полей разные анализаторы во время индекса и запроса и т. Д. Тип поля состоит из токенайзера, фильтров и т. Д. Или их составления.

Для создания пользовательского типа поля доступно множество токенизаторов и фильтров.В файле schema.xml предусмотрено несколько типов полей по умолчанию.Вы можете применить их к своим полям и проверить, как данные индексируются (как создаются токены) во время запроса и время индексации.

Это можно проверить или проанализировать с помощью страницы администрирования solr.

Пример пользовательского типа поля.

<fieldType name="Custom_text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Ввод в поле solr: "Please, email john.doe@foo.com by 03-09, re: m37-xq."

Вывод поля solr: "please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"

Сейчасвозвращаясь к вашему вопросу.

  1. Похоже, вы хотите точное совпадение.Вы можете использовать строковый тип для своего поля вместо текста.Если вы используете текст, то вы используете ключевое слово Tokenizer, которое не будет создавать никаких токенов вашего текста.Он будет сохранен / проиндексирован как есть.Следовательно, вы получите точное совпадение.

  2. В этом случае применяемый тип поля мог создать токены, такие как "Tesla LLC" или "Tesla", "LLC" в solr.Здесь также все зависит от того, какие токенизаторы и установщики использовались для одного и того же типа поля.Таким образом, он не будет соответствовать строке «TeslaLLC», так как solr не находит токены для той же строки.

С Solr возможно многое.Но все, что вам нужно для понимания поля, типа поля, токенизаторов, фильтров, анализаторов во время индекса и времени запроса (вы можете оставить один и тот же анализатор во время запроса и индекса, а также различаться, зависит от ваших требований)

Ссылка на токенизеры, фильтры

...