Полнотекстовый поиск по MySQL: поиск по нескольким словам в одной таблице БД - PullRequest
1 голос
/ 24 апреля 2020

У меня есть таблица пользовательских БД:

|firstname|lastname|username|Country|id|
------------------------------------------------
|Ricky    |Jonh    |rjohn   |USA    |1 |
|Mery     |Cris    |mcris   |USA    |2 |
|Ricky    |Cris    |rcris   |Germany|3 |
|Michacle |Ricky   |mricky  |USA    |4 |
|Michacle |Jonh    |john    |USA    |5 |

В случае, если пользователь вводит:

  • «Рикки» - поиск должен вернуть 3 записи (1, 3,4)

  • "Ricky USA" - должно вернуть 2 записи (поскольку только слова в первой и третьей записи имеют эти слова в столбцах)

  • "Ricky John USA" - возвращает только первую запись.

Таким образом, поиск должен возвращать записи, в которых каждое слово поиска должно находиться в одной записи, но может находиться в разных столбцах.

Может кто-нибудь поделиться подходом, как реализовать такой поиск на MySQL.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Спасибо, O. Джонс

Вот решение

  SELECT *,
  MATCH (firstname, lastname, username, Country) 
         AGAINST ('+Ricky +Cris +Germany' IN boolean MODE) AS score
  FROM user 
  WHERE MATCH (firstname, lastname, username, Country)
         AGAINST ('+Ricky +Cris +Germany' IN boolean MODE)
  ORDER BY score DESC
0 голосов
/ 24 апреля 2020

Это включает в себя настройку и последующее использование индекса FULLTEXT. Это устанавливает индекс (https://www.db-fiddle.com/f/2E7ep7eos8wNWUNq6VTCEv/0):

CREATE FULLTEXT INDEX textindex ON user (firstname, lastname, username, country);  

И это использует его. Он показывает оценку FULLTEXT для каждой записи и упорядочивает их в первую очередь.

SELECT *,
       MATCH (firstname, lastname, username, Country)
         AGAINST ('Ricky Cris Germany' IN NATURAL LANGUAGE MODE) AS score
  FROM user 
 WHERE MATCH (firstname, lastname, username, Country)
         AGAINST ('Ricky Cris Germany' IN NATURAL LANGUAGE MODE)
ORDER BY score DESC

FULLTEXT в режиме естественного языка по своей природе нечеткий. Он предназначен для показа результатов поиска кандидатов пользователю, чтобы он мог выбрать соответствующий. Ему нравится возвращать много «ложноположительных» строк, надеюсь, с меньшими оценками, чем реальные строки. Редактировать FULLTEXT работает как поисковые машины inte rnet: он отображает несколько результатов и делает все возможное, чтобы ранжировать их по релевантности. Затем он полагается на пользователя, чтобы выбрать желаемый результат. Слишком много ожиданий от FULLTEXT, что он удалит нежелательные элементы из наборов результатов.

Кроме того, поиск на естественном языке FULLTEXT делает странные вещи в таблицах, содержащих менее пары сотен строк. Так что не расстраивайтесь, если ваши крошечные тестовые таблицы, кажется, не работают правильно.

...