2008-12-05 10 views
8

Sé cómo hacer una búsqueda de php mysql y mostrar los resultados. Sin embargo, debido a la naturaleza de lo que estoy tratando de lograr, necesito poder ordenar por relevancia. Permítanme explicar esto mejor:PHP MySQL Search And Order By Relevancy

Consultas normales "Apple iPhone Applications" buscarán en la base de datos usando% apple iphone application%, pero si no hay registros que muestren esa frase en ese orden exacto, la búsqueda no producirá nada.

Lo que básicamente tengo que hacer es buscar 'manzana', 'iphone' y 'aplicaciones' por separado y luego combinar los resultados en uno, y luego tengo que calificar la relevancia por cuántas instancias de la palabra encontrado en los registros. Por ejemplo si hacía lo que quería hacer y les volví siguiente:

Iphone Applications From Apple 
Apple Make The Best Apple Iphone Applications 
Iphone Applications 

Ellos clasificar de la siguiente manera:

Apple Make The Best Apple Iphone Applications 
Iphone Applications From Apple 
Iphone Applications 

Debido a cuántas instancias de los términos de búsqueda se encuentran. Veo destacado:

[Apple] Make The Best [Apple] [Iphone] [Applications] 
[Iphone] [Applications] From [Apple] 
[Iphone] [Applications] 

espero haber explicado suficientemente bien y yo estaría muy agradecido si alguien me pudiera dar alguna punteros.

Respuesta

6

echar un vistazo a la MySQL FULLTEXT search functions, Estos deberían resultados por relevancia volverá automáticamente y le dará mucho más control sobre sus búsquedas

El único problema potencial con el uso de índices de texto completo es que no son compatibles con tablas InnoDB.

+2

Sé que esto es viejo, pero si alguien se tropieza con esto. ahora son compatibles con innoDB –

5

Un google rápido me dio this link.

Ejemplo:

select title, match (title,content) against (”internet”) as score 
from cont 
where match (title,content) against (”internet”) limit 10; 
0
SELECT field2, field3, ..., MATCH(field1, field2) AGAINST ("search string") AS relevance WHERE MATCH(field1, field2) AGAINST "search string" ORDER BY relevance DESC LIMIT 0,10 

En el conjunto de resultados, habrá un campo "relevancia", que se utiliza aquí para ordenar los resultados.

1

Tal vez esto podría ayudar a alguien (orden por relevancia y mantener el recuento de palabras):

Ninguno de texto completo:

SELECT *, ((value_column LIKE '%rusten%') + (value_column LIKE '%dagen%') + (value_column LIKE '%bezoek%') + (value_column LIKE '%moeten%')) as count_words 
FROM data_table 
WHERE (value_column LIKE '%dagen%' OR value_column LIKE '%rusten%' OR value_column LIKE '%bezoek%' OR value_column LIKE '%moeten%') 
ORDER BY count_words DESC 

texto completo:

SELECT * FROM data_table 
WHERE MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) 
ORDER BY MATCH(value_column) AGAINST('+dagen +rusten +bezoek +moeten' IN BOOLEAN MODE) DESC; 
+1

Esto funcionó para mí. Quería resultados ordenados por relevancia, pero también quería que se devolvieran las coincidencias parciales, lo que no admite el texto completo. – cmann

0

I Do not Qué es exactamente lo que quieres, pero el siguiente código definitivamente funciona para ti.

SELECT ("some text here" or `column_name`) RLIKE "Apple|Iphone|Application" AS Result ORDER BY Result DESC; 

por separado todas las palabras con Bar (|), pero los resultados serán 1 o 0 fundada o no resp. Si desea obtener filas fundadas, consulte a continuación.

SELECT * FROM "table_name" WHERE `column_name` RLIKE "Apple|Iphone|Application";