Как создать хороший поиск, включающий совпадающие записи

#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' .

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