Solr подстановочные знаки и экранированные символы вместе - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь найти в Solr, но есть проблема. Например, у меня есть эта фраза, хранящаяся в solr: [Karina K[arina ? ! & ?!a& m.malina m:malina 0sal0 0 AND. Теперь я хочу найти любой запрос с подстановочными знаками *. Например, я пишу *[* или *?* и Solr верните мне эту фразу. Но это не работает. Что я пробовал:

  1. Я могу использовать экранированные символы, подобные этому K\[arina, но в этом случае мне нужно ввести всю фразу введите описание изображения здесь
  2. Но если я напишу K\[arin*, у меня ничего не получится введите описание изображения здесь
  3. Окей, я попытался K\[arin\*, и это сработало введите описание изображения здесь
  4. Хорошо, тогда я ставлю * в начале \*\[arina, и все в порядке введите описание изображения здесь
  5. И наконец \*\[arin\* не работает. Почему? Где логик? введите описание изображения здесь
  6. Где-то я прочитал, что я могу использовать " например "*\[arin*" или даже *[arin*, но не введите описание изображения здесь
  7. И интересно, что K\[arina как целое слово, которое я могу искать, или \?\!a\&, но \? я не могу.

1 Ответ

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

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

Lucene и Solr работают с токенами - токены обычно представляют собой отдельные слова (после некоторой обработки) из входного потока символов, разделенные («токенизированные») на разные символы в зависимости от того, что является токенизатором для поля. Токенизатор обычно разделяется на большинство не алфавитных символов c, и явное определение цепочки анализа позволит вам получить поведение, которое вы ищете.

Я предполагаю, что ваш токенизатор разбивается на большую часть специальные символы, которые есть в вашей строке, так что K[arina фактически заканчивается индексированием как K и arina.

K\\[arina => K, arina (split on \ and [)

Нет соответствия токенов:

K\[arin* => nothing happens, since there is no token starting with K[arin

Исключение подстановочного знака означает, что вся строка отправляется токенизатору, по сути, это не поиск по шаблону, а поиск со строкой, содержащей взамен *:

K\[arin\* => K, arin -> K matches (and arin if an ngram filter is attached)
(one of your later examples show that there is no ngram filter)

То же поведение здесь, минуя звездочку означает, что вся строка отправляется токенизатору вместо поиска по шаблону:

\*\[arina => arina -> arina matches

И когда токены не совпадают:

\*\[arin\* => arin -> there is no token matching arin, only arina.

Случай 6 предназначен для фраз, что токены с пробелами между ними ищутся как одно совпадение. Сейчас я пропущу это.

Последний случай фактически заканчивается пустым поиском, поскольку токенизатор разделится на ? и не оставит токенов, которые можно было бы использовать. Ваш первый пример в этой строке оставляет ожидаемые токены, K и arina:

K\[arina => K, arina
\?\!a\& => a
\? => <nothing>
...