Полнотекстовый поиск MyIsam против нескольких% term% - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть поле с именем filepath, которое я пытаюсь найти. Вот пример пути:

/mnt/qfs-X/Asset_Management/XG_Marketing_/Episodic-SG_1001_1233.jpg

Я бы хотел найти следующее и получить совпадение:

search = "qf episodic sg_1001 JPG"

Как бы я это сделал при полнотекстовом поиске в mysql / myisam? Теперь у меня есть:

SELECT * FROM x_files2 WHERE MATCH(path)
AGAINST('qf episodic sg_1001 JPG' in boolean mode)

Но он возвращает слишком много результатов (похоже, он возвращает, если найдены какие-либо термины, а не только те, в которых все найдены.

1 Ответ

0 голосов
/ 01 ноября 2018

Поставьте + перед каждым словом:

AGAINST('+qf* +episodic +sg_1001* +JPG' in boolean mode)

У вас установлена ​​минимальная длина слова 2? Если нет, то могут быть и другие проблемы.

+ избегает "слишком много".

Подумайте о переключении на InnoDB, теперь, когда он имеет FULLTEXT.

Возможно, вам придется отказаться от использования FULLTEXT и переключиться на LIKE:

WHERE path LIKE '%qf%episodic%sg_1001%JPG%'

Если производительность является проблемой, рассмотрите что-то вроде

WHERE MATCH(path) AGAINST('...' IN BOOLEAN MODE)  -- using some of the words
  AND path LIKE '...'   -- as above

Сначала будет запускаться MATCH, значительно сокращая количество возможных строк, затем LIKE заботится о деталях.

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

...