2013-10-11 4 views
0

Je construis un catalogue de produits très simple qui va stocker des produits dans la table mysql et je veux rechercher des produits aussi vite que possible (et le plus pertinent possible). La base de données des produits sera assez grande (environ 500.000 produits), c'est pourquoi les recherches utilisant "like" qui n'utilisent pas d'index sont très lentes.Mysql (fulltext?) Recherche de produits

J'ai de nombreux domaines, mais les seuls que je veux rechercher sont:

  • product_id = bigint
  • title = varchar (255)
  • description = texte

J'ai essayé expérimenter avec la recherche fulltext, mais il y avait quelques problèmes:

  • Je ne peux pas rechercher par ID_produit car il est grand entier et ne peut pas être indexé dans l'index de texte intégral (parfois l'utilisateur connaît l'ID du produit)
  • si je recherche "Mètre XY-123" Je n'ai pas de résultats de recherche même si le titre du produit unique et la description contiennent les deux mots ("meter" et "xy-123")
  • Je ne pouvais pas rechercher de sous-chaînes - par exemple si le titre du produit est "Foobar 123" il doit être retourné, même si les recherches des utilisateurs pour:
    • foo bar 123
    • bar 123
    • foobar 12
    • foo
    • etc.
  • les résultats doivent également être retournés classés par ordre de pertinence. si j'ai deux produits "foobar 123" et "foobar 456" et que l'utilisateur recherche "foobar 4", alors les deux produits doivent être retournés (correspondre à n'importe quel mot) mais le second produit doit être mieux classé (car il contient également le numéro 4) premier (qui ne contient pas le numéro 4).
  • Les produits doivent également être classés en fonction du champ dans lequel se trouve la valeur. Dans ce cas, le champ product_id a un poids supérieur à celui du titre, qui a également un poids plus élevé que la description. Par exemple. si les recherches des utilisateurs pour « 1234 », puis:
    • premier produit classé devrait être celui qui a product_id 1234
    • après il devrait être classé des produits qui comprennent « 1234 » dans le titre
    • ensuite des produits qui comprennent ce nombre Description intérieure

Quelle serait la meilleure façon de faire des recherches sur cette table comme ça? La seule façon de donner des résultats bons dans mon cas est de séparer la requête et d'interroger plusieurs requêtes en utilisant l'opérateur "like" pour chaque chaîne et de calculer le poids mais cette solution fonctionne très lentement (même plus de 15 secondes pour une seule requête ce qui est trop lent).

Je ne m'attends pas à ce que tout soit possible en utilisant une seule requête mais je cherche une solution rapide et pertinente. Si cela signifie la construction d'une sorte d'index de mot personnalisé ou similaire, je suis également prêt à le faire, j'ai juste besoin d'une idée de la façon de gérer cela?

merci!

+0

Je ne sais pas mais vous pouvez essayer avec les recherches de texte intégral avec l'extension de requête –

+0

J'utilise Sphinx Search Engine. C'est un travail parfait pour la recherche en texte intégral. Voir: http://sphinxsearch.com/docs/2.1.2/ – Adam

+0

Malheureusement Sphinx n'est pas une option. Je cherche l'option mysql (& php) seulement. – j99

Répondre

0

Nous avons migré la recherche vers Sphinx. Nous devons maintenant affiner les résultats.