Как получить тот же эффект, что и like %someword% с match-against в MySQL с использованием solr и т. д


Возможный дубликат: Как использовать префиксные подстановочные знаки, такие как '* abc ' с соответствием

Но я не могу найти свой ответ, поэтому задал этот вопрос, извините за дубликат.

Я выполняю запрос в MySQL

Записи:

  1. я Вася Пупкин.
  2. Джон Доу-мужчина.
  3. Джон фамилия ДОУ

Как %john d% будет соответствовать первым двум результатам, потому что они находятся в том же порядке, и дикие символы будут соответствовать ему в любом месте запись Но в большом наборе данных это убило производительность

Поэтому я погуглил и нашел матч против в логическом режиме в качестве альтернативы.Сейчас, мой поисковый запрос: john d Он пытался

AGAINST('"john d"')
AGAINST('john d*')
AGAINST('+john +d') etc
Я только хочу получить результаты, которые находятся в том же порядке. (например, 1. Я-Джон Доу. 2. john doe-это человек) для этого поискового термина john d, но я не могу его достичь. как %john d% дает желаемое, но это убивает производительность. как я могу получить желаемый результат в MySQL с помощью fast спектакль.

В возможном дубликате: Как использовать префиксные подстановочные знаки, такие как '* abc ' с соответствием

@GolezTrol дал решение создать отдельный столбец, в котором он обратит строки:

user_login user_login_rev
xyzabc     cbazyx

Затем, вместо того, чтобы искать '%Джон Д', мы можем искать 'Джон Д%', который является гораздо быстрее, если столбец индексируется.

Но

@PeerBr будьте уверены, что инвертирование строк не поможет вам, если вы хотите найти материал с середины веревки. Вы не найдете "Jimmy Blue Jones", набрав 'Blue%', используя нормальные индексы, или инвертировав 'Blue%', используя инвертированные inices.

Спасибо

1 3

1 ответ:

Для Solr это должно хорошо работать с полем с KeywordTokenizer и ReverseWildcardFilter :

<fieldType name="c_string" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
</fieldType>

В зависимости от вашего варианта использования вы можете удалить ASCIIFoldingFilterFactory. LowerCaseFilterFactory гарантирует, что строка находится в нижнем регистре правильно, в то время как KeywordTokenizer сохраняет всю строку как один маркер - так что вы не соответствуете случаю #3 в ваших примерах.

ReversedWildcardFilter также хранит маркеры в обратном порядке, и когда он обнаруживает подстановочный знак префикса, он также добавляет обратный поиск префикса маркера, так что вы все еще получаете хорошую производительность от индексированных маркеров.