MariaDB полнотекстовый поиск со специальными символами и «слово начинается с» - PullRequest
0 голосов
/ 25 октября 2018

Я могу выполнить полнотекстовый запрос MariaDB, который ищет слово, начинающееся следующим образом:

select * from mytable
where match(mycol) against ('+test*' in boolean mode)>0.0;

Это находит слова типа "тест", "тестер", "тестирование".

Если моя строка поиска содержит специальные символы, я могу поставить строку поиска в кавычки:

select * from mytable
where match(mycol) against ('+"test-server"' in boolean mode)>0.0;

Это найдет все строки, содержащие строку test-server.

Но, похоже, я не могуобъединить оба:

select * from mytable
where match(mycol) against ('+"test-serv"*' in boolean mode)>0.0;

Это приводит к ошибке:

Error: (conn:7) syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*'
SQLState:  42000
ErrorCode: 1064

Размещение ´ * ´ в строке в кавычках не даст результатов (как и ожидалось):

select * from mytable
where match(mycol) against ('+"test-serv*"' in boolean mode)>0.0;

Кто-нибудь знает, является ли это ограничением MariaDB?Или ошибка?

Моя версия MariaDB - 10.0.31

1 Ответ

0 голосов
/ 26 октября 2018
WHERE MATCH(mycol) AGAINST('+test +serv*' IN BOOLEAN MODE)
  AND mycol LIKE '%test_serv%'

MATCH найдет нужные строки плюс некоторые ненужные. Тогда LIKE отфильтровывает выбоины.Поскольку LIKE применяется только к некоторым строкам, его медлительность маскируется.

(Конечно, это работает не во всех случаях. И требует некоторых ручных манипуляций.)

d'Artagnan - Используйте

WHERE MATCH(mycol) AGAINST("+Arta*" IN BOOLEAN MODE)
  AND mycol LIKE '%d\'Artagnan%'

Обратите внимание, что я использовал подходящее экранирование для ввода апострофа в строку LIKE.

Итак, алгоритм для вашего кодавыглядит примерно так:

  1. Разбить строку на «слова» таким же образом FULLTEXT.
  2. Бросить любые слишком короткие строки.
  3. Если нетслова остаются, тогда вы не можете использовать FULLTEXT и застряли с медленной LIKE.
  4. Stick * после последнего слова (или каждого слова?).
  5. ПостроитьAGAINST с этими словами.
  6. Добавить AND LIKE '%...%' с исходной фразой, надлежащим образом сбежавшей.
...