#mysql #full-text-search
#mysql #полнотекстовый поиск
Вопрос:
Я не знаю, как объяснить это в названии, у меня возникла проблема, когда я ищу, что при поиске типичного запроса, такого как united kingdom
и записи включают записи, united states
которые мне не нужны для включения в результат запроса, даже при поиске new york
я получаю некоторые записи, возвращенные из york
(в Англии).
Другой, при поиске maidstone
запрос не возвращает никаких записей вообще, но в базе данных он существует.
Мне нужно решить проблему с этим запросом, он должен искать строки, соответствующие введенному запросу, и удалять их, которые соответствуют параметрам — когда я говорю параметры, я имею в виду as rec.column_name = etc...
.
При поиске united kingdom
:
WHERE ( MATCH (rec.street_name, rec.city, rec.state, rec.country) AGAINST ('united kingdom' IN BOOLEAN MODE)
OR ( rec.street_name = 'united kingdom'
OR rec.city = 'united kingdom'
OR rec.state = 'united kingdom'
OR rec.country = 'united kingdom'
)
) AND ( rec.visible_listing = 1 AND rec.marked_delete = 0 AND rec.is_archive = 0 )
При поиске maidstone
:
WHERE ( MATCH (rec.street_name, rec.city, rec.state, rec.country) AGAINST ('maidstone' IN BOOLEAN MODE)
OR ( rec.street_name = 'maidstone'
OR rec.city = 'maidstone'
OR rec.state = 'maidstone'
OR rec.country = 'maidstone'
)
) AND ( rec.visible_listing = 1 AND rec.marked_delete = 0 AND rec.is_archive = 0 )
Это общие записи в таблице:
-------------------- --------------- ---------------- ---------------- ----------------- --------------- ------------
| street_name | city | state | country | visible_listing | marked_delete | is_archive |
-------------------- --------------- ---------------- ---------------- ----------------- --------------- ------------
| Mill Hill | Dover | Kent | United Kingdom | 1 | 0 | 0 |
| Penmaes | Rhayader | Powys | United Kingdom | 1 | 0 | 0 |
| Essex St | Jersey City | Hudson | United States | 1 | 0 | 0 |
| Vesey St | New York | New York | United States | 1 | 0 | 0 |
| E Broadway | Manhattan | New York | United States | 1 | 0 | 0 |
| Cowdray Square | Dover | Kent | United Kingdom | 1 | 0 | 1 |
| Falsgrave Crescent | York | England | United Kingdom | 1 | 0 | 0 |
| Tait Ave | Sanger | California | United States | 1 | 0 | 0 |
| Morton Ave | Parsons | Kansas | United States | 1 | 0 | 0 |
| N Washington St | Clinton | Missouri | United States | 1 | 0 | 0 |
| Lower Barngoose | Carn Brea | Cornwall | United Kingdom | 1 | 0 | 0 |
| Moorwell Dr | Shepherdswell | Kent | United Kingdom | 1 | 0 | 0 |
| Elm Grove | Maidstone | Kent | United Kingdom | 1 | 0 | 0 |
| Manse Rd | Killin | Stirling | United Kingdom | 1 | 0 | 0 |
| Muirkirk Dr | Glasgow | Glasgow City | United Kingdom | 1 | 0 | 0 |
| Alveston Ave | Harrow | Greater London | United Kingdom | 1 | 0 | 0 |
-------------------- --------------- ---------------- ---------------- ----------------- --------------- ------------
Как мне создать хороший поисковый запрос, который возвращает не ложные данные?
Комментарии:
1. Почему вы комбинируете обычный поиск с ПОЛНОТЕКСТОВЫМ поиском?
2. Первые строки после WHERE — это условие СООТВЕТСТВИЯ, которое можно использовать только для полей с полнотекстовым индексом. Строки ниже, начинающиеся с ИЛИ, являются обычными условиями, которые проверяют точное совпадение (проверяет, содержит ли поле буквенную строку). Не кажется полезным объединять их.
3. Ах да, это был момент, когда я пытался сделать «хороший поиск», я удалил это и использовал ваше решение с использованием двойных кавычек. В любом случае, приветствия.
Ответ №1:
Поместите строку поиска в двойные кавычки: '"united kingdom"'
для точного совпадения.
Если вы хотите выполнить поиск по обоим словам, но не обязательно рядом друг с другом, вы можете использовать оператор : ' united kingdom'
.
Обратите внимание, что поиск будет учитываться с учетом регистра, если вы используете двоичную сортировку для столбцов, в которых вы ищете.