Как найти точные ключевые слова в поиске Solr? - PullRequest
0 голосов
/ 27 февраля 2020

На самом деле я сталкиваюсь с одной проблемой в поиске Solr. Существует поле автора, в котором я сохранил два значения, например «глубокий кумар-сингх» и «глубокий кумар-сингх». Когда я ищу автора: «глубокий кумар-сингх» возвращает оба результата. Но я хочу, чтобы только один результат был точным.

Вот описание моего поля:

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

Я создал поле authorFacet, чтобы получить фасет автора.

<field name="authorFacet" type="string_ci" indexed="true" stored="false" multiValued="true"/>

Когда я выбрал authorFacet, он возвращает счет 1 для обоих авторов. Например:

deep kumar-singh (1)

deep kumar singh (1 )

Я хочу, чтобы только один результат был точным.

Как я могу получить это ?, Любое предложение будет очень полезным.

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Измените fieldType из author на строку с text_general и переиндексируйте данные. Вы бы получили желаемый результат. Как поле, которое имеет строку в качестве типа, оно не будет создавать никакого токена слова и поможет достичь точного соответствия.

Кроме того, то же самое можно проанализировать на странице администрирования solr. Go к странице администрирования solr. Выберите ядро ​​/ коллекцию. Нажмите на анализ. Вы можете выбрать поле и проверить токен индекса и время запроса, если они соответствуют вашим ожиданиям.

И для этого вам не нужно 2 разных поля для автора. Вы можете использовать одно поле со строкой, так как тип поля можно использовать как для огранки, так и для поиска.

solr exact match

0 голосов
/ 02 марта 2020

Вы можете изменить тип своего поля, добавив charFilter в анализаторы индекса и запросов, например:

<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[-]" replacement=""/>

Обратите внимание, что charFilter должен быть помещен перед токенизатором. По сути, вы удаляете дефисы перед токенизацией.

Итак, если вы ищете с помощью:

  • "deep", вы получите "deep kumar-singh" и "deep kumar singh".
  • "кумар-сингх", вы получаете только "глубокий кумар-сингх".
  • "кумар-сингх", вы получаете только "глубокий кумар-сингх".

Я полагаю, это то, что вам нужно.

Если вы не хотите изменять тип поля text_general, вы можете создать другой тип поля с такими же анализаторами, как у text_general, и добавить charFilter к новому типу поля.

0 голосов
/ 27 февраля 2020

Если вы хотите точное совпадение, вам следует использовать строковый тип поля, а не текстовое поле. Строковые поля хранятся как есть, без каких-либо преобразований.

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

Имейте в виду, что если вы используете строку, то «ab c» будет отличаться от «ab c». (обратите внимание на дополнительный период) или от "ab c" (обратите внимание на дополнительный пробел). Концепция точного поиска на самом деле довольно сложна, если вы хотите обрабатывать эти случаи иначе (см. { ссылка })

...