Как сопоставить и отсортировать по сходству в MySQL? - PullRequest
5 голосов
/ 18 мая 2010

В настоящее время я выполняю функцию поиска. Скажем в моей базе данных, у меня есть эти данные:

  • Ключевое слово 1
  • * 1006 слово 2 *
  • KEYWORD3
  • Keysomething
  • Key

и пользователь ввел: «Ключ» в качестве ключевого слова для поиска. Это мой текущий запрос:

SELECT * FROM data WHERE (
  data_string LIKE '$key%' OR 
  data_string LIKE '%$key%' OR
  data_string LIKE '%$key'
)

В основном, у меня есть 2 вопроса:

  1. Как сортировать по (по порядку) сходству. Из приведенного выше примера я хотел «Ключ» в качестве моего первого результата. Мой текущий результат: Keyword1, Keyword2, Keyword3, Keysomething и Key

  2. Мой запрос SQL выполняет поиск только по столбцу «data_string», что если я хочу найти столбец других? Нужно ли делать что-то вроде этого:

SELECT * FROM data WHERE (
  data_string LIKE '$key%' OR
  data_string LIKE '%$key%' OR
  data_string LIKE '%$key'
) OR (
  data_other LIKE '$key%' OR
  data_other LIKE '%$key%' OR
  data_other LIKE '%$key'
) -- ...

Есть ли лучший / более быстрый запрос, чем Q2?

1 Ответ

6 голосов
/ 18 мая 2010

Я не уверен, является ли LIKE правильным способом сделать это. Если вам нужно искать в тексте ключевые слова и сортировать результаты по показателю релевантности, вам следует использовать полнотекстовый индекс MySQL и функции полнотекстового поиска MySQL . Извините, если это уводит вас от того, что вы на самом деле пытаетесь сделать, но я рекомендую один раз взглянуть на это. Некоторые цитаты из справочника MySQL:

1) Как создать полнотекстовый индекс для нескольких столбцов таблицы

mysql> CREATE TABLE articles (
    ->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    ->   title VARCHAR(200),
    ->   body TEXT,
    ->   FULLTEXT (title,body)
    -> );

2) Пример данных

mysql> INSERT INTO articles (title,body) VALUES
    -> ('MySQL Tutorial','DBMS stands for DataBase ...'),
    -> ('How To Use MySQL Well','After you went through a ...'),
    -> ('Optimizing MySQL','In this tutorial we will show ...'),
    -> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    -> ('MySQL vs. YourSQL','In the following database comparison ...'),
    -> ('MySQL Security','When configured properly, MySQL ...');

3) Пример запроса, который ищет ключевые слова в нескольких столбцах и отображает результат + оценка:

mysql> SELECT id, body, MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root') AS score
    -> FROM articles WHERE MATCH (title,body) AGAINST
    -> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
...