Я создаю сайт с требованием включить множественные слова, но исключаю одиночные слова, а также включать более длинные фразы, но исключая короткие фразы, найденные внутри него.
Например:
поиск «Хлебов» должен возвращать результаты с «хлебом» внутри него, но не «хлеб» или «читать».
поиск «книги в мягкой обложке» должен возвращать результаты с «книжкой в мягкой обложке» внутри нее, но не «мягкой обложкой» или «книгой».
Запрос, который я пробовал:
SELECT * FROM table WHERE (field LIKE '%breads%') AND (field NOT LIKE '%bread%')
… которые явно не дали никаких результатов, хотя в нем есть записи с хлебом и хлебом.
Я понимаю, почему этот запрос терпит неудачу (я говорю, что оба включают и исключают одни и те же строки), но я не могу придумать правильную логику для применения к коду, чтобы заставить его работать.
Поиск %breads%
НИКОГДА не возвращал бы bread
или не read
, так как «s» является обязательным символом для матча. Поэтому просто исключите условие и:
SELECT ... WHERE (field LIKE '%breads%') SELECT ... WHERE (field LIKE '%paperback book%');
Вы должны использовать FULL TEXT SEARCH .
Это решит вашу проблему с хлебом / чтением.
Я считаю, что использование подстановочных знаков здесь нецелесообразно. Допустим, вы используете '%read%'
, теперь это также будет возвращать bread
, breads
т. Д., Поэтому я рекомендовал Full Text Search
С MySQL вы можете использовать REGEXP вместо того, что бы лучше контролировать ваш запрос …
SELECT * FROM table WHERE field REGEXP '\s+read\s+'
Это, по крайней мере, обеспечит соблюдение границ слов вокруг вашего запроса и даст вам гораздо лучший контроль над вашим соответствием – с недостатком производительности.