Возможный дубликат: Как использовать подстановочные знаки, такие как ‘* abc’, с сопоставлением
Но я не могу найти свой ответ, поэтому задал этот вопрос извините за дубликат.
Я выполняю запрос в MySQL
Записи:
лайк % Джон Д% будет соответствовать первым двум результатам, потому что они находятся в одинаковом порядке, и символы подстановки будут соответствовать ему в любом месте записи
Но в большом наборе данных это убило производительность
Так я гуглил и нашел МАТЧ ПРОТИВ В БУЛЕВОМ РЕЖИМЕ
как альтернатива. Теперь,
Мой поисковый термин: Джон Д
Пробовал
AGAINST('"john d"')
AGAINST('john d*')
AGAINST('+john +d') etc
Я только хочу получить результаты, которые находятся в том же порядке.
(например, 1. я — Джон Доу. 2. Джон Доу — мужчина) для этого поискового термина Джон, но я не могу достичь его. как% john d% дает желаемое, но это убивает производительность.
Как я могу получить желаемый результат в MySQL с высокой производительностью.
В возможной копии: Как использовать подстановочные знаки, такие как ‘* abc’, с сопоставлением
@GolezTrol дал решение создать отдельный столбец, в котором он перевернул строки:
user_login user_login_rev
xyzabc cbazyx
Тогда вместо того, чтобы искать ‘% Джон Д’, мы можем искать ‘john d%’, который намного быстрее, если столбец проиндексирован.
Но
@PeerBr Остерегайтесь того, что инвертирование строк не поможет вам, если вы хотите найти что-то посередине строки. Вы не найдете «Джимми Блю Джонс» набрав «Голубой%» используя нормальные индексы, ни путем инвертирования «Голубой%» используя перевернутые метки.
Спасибо
Для 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 также сохраняет токены в обратном порядке, и когда он обнаруживает подстановочный знак префикса, он также добавляет поиск обратного префикса токена, так что вы по-прежнему получаете хорошую производительность от индексированных токенов.
Других решений пока нет …