usando registros recoger para múltiple multiple listar inteligente datos con codigo busqueda buscar buscador bootstrap avanzado php mysql search

registros - recoger datos de un select múltiple con php



¿La mejor forma de hacer una búsqueda ponderada en múltiples campos en mysql? (5)

Debe usar un indexador dedicado para captar previamente todos los datos en un índice optimizado y con capacidad de búsqueda. Sphinx y productos similares lo hacen muy bien.

Esto es lo que quiero hacer:

  • relacionar un tema de búsqueda con múltiples campos de mi tabla
  • ordene los resultados por importancia del campo y relevancia del emparejamiento (en ese orden)

Ej .: supongamos que tengo un blog. Entonces alguien busca "php". Los resultados aparecerían de esa manera:

  • primero, las coincidencias para el campo ''título'', ordenadas por relevancia
  • luego, las coincidencias para el campo ''cuerpo'', ordenadas por relevancia también
  • y así sucesivamente con los campos especificados ...

De hecho, hice esto con una clase en PHP, pero usa muchos SINDICATOS (¡muchos!) Y crece con el tamaño del tema de búsqueda. Así que estoy preocupado por el rendimiento y los problemas de DOS. ¿Alguien tiene una pista sobre esto?


Hay una forma nativa y limpia de hacerlo utilizando la función CASE de MySQL ( https://dev.mysql.com/doc/refman/5.7/en/case.html ).

Ejemplo (no probado):

SELECT * FROM `myTable` WHERE (`name` LIKE "%searchterm%" OR `description` LIKE %searchterm%" OR `url` LIKE "%searchterm%") ORDER BY CASE WHEN `name` LIKE "searchterm%" THEN 20 WHEN `name` LIKE "%searchterm%" THEN 10 WHEN `description` LIKE "%searchterm%" THEN 5 WHEN `url` LIKE "%searchterm%" THEN 1 ELSE 0 END LIMIT 20

¡Lo he usado para muchas búsquedas ponderadas y funciona de maravilla!


Probablemente este enfoque de hacer una búsqueda / resultados ponderados sea adecuado para usted:

SELECT *, IF( `name` LIKE "searchterm%", 20, IF(`name` LIKE "%searchterm%", 10, 0) ) + IF(`description` LIKE "%searchterm%", 5, 0) + IF(`url` LIKE "%searchterm%", 1, 0) AS `weight` FROM `myTable` WHERE ( `name` LIKE "%searchterm%" OR `description` LIKE "%searchterm%" OR `url` LIKE "%searchterm%" ) ORDER BY `weight` DESC LIMIT 20

Utiliza una subconsulta selecta para proporcionar el peso para ordenar los resultados. En este caso, tres campos revisados, puede especificar un peso por campo. Es probable que sea menos costoso que los sindicatos y probablemente una de las formas más rápidas en MySQL simple solamente.

Si tiene más datos y necesita resultados más rápidos, puede considerar usar algo como Sphinx o Lucene.


Tuve esta misma pregunta y fue respondida completamente en uno de los foros de MySQL. Aquí está el hilo. Tipo de un hilo largo (porque soy un poco largo) pero la recompensa es justo lo que estás buscando.


puede agregar múltiples valores de mysql MATCH () juntos, primero multiplicando cada uno por su peso.

simplificado por supuesto ...

''(MATCH(column1) AGAINST(/'''.$_GET[''search_string''].''/') * ''.$column1_weight.'') + (MATCH(column2) AGAINST(/'''.$_GET[''search_string''].''/') * ''.$column2_weight.'') + (MATCH(column3) AGAINST(/'''.$_GET[''search_string''].''/') * ''.$column3_weight.'') AS relevance''

entonces

''ORDER BY relevance''