2010-05-18 13 views
5

Actualmente, estoy haciendo una función de búsqueda. Digamos que en mi base de datos, tengo estos datos:¿Cómo hacer coincidir y ordenar por similitud en MySQL?

  • Palabra clave1
  • clave2
  • KEYWORD3
  • Keysomething
  • clave

y el usuario introduce: "clave" como el palabra clave para buscar Esta es mi consulta actual:

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

Básicamente, tengo 2 preguntas:

  1. ¿Cómo puedo ordenar siguientes (en orden por) de similitud. En el ejemplo anterior, quería "Clave" como mi primer resultado. Mi resultado actual es: Keyword1, Keyword2, Keyword3, Keysomething y Key

  2. Mi búsqueda SQL solo busca por la columna "data_string", ¿qué sucede si quiero buscar otras columnas? ¿Necesito hacer algo como esto:

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

¿Hay alguna consulta mejor/más rápido que la Q2?

Respuesta

6

No estoy seguro de si LIKE es la forma correcta de hacerlo. Si necesita buscar palabras clave en su texto y ordenar los resultados por relevancia, debe usar MySQL Full-Text index y MySQL Full-text Search functions. Disculpe si esto lo aleja de lo que realmente está tratando de hacer, pero sí le recomiendo echarle un vistazo. Algunas citas de MySQL manual de referencia:

1) cómo crear un índice de texto en varias columnas de una tabla

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

2) muestra

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) Muestra consulta que busca varias palabras clave en las columnas y muestra el resultado + el puntaje:

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 | 
+----+-------------------------------------+-----------------+ 
Cuestiones relacionadas