2010-09-09 4 views
0

Supposons que j'ai une base de données MySQL nommée DB et une table nommée ContactInfo. Ce qui suit est sa structure et des données par exemple (un seul élément):Recherche plein texte à partir de la base de données

Tableau ---- ContactInfo:


 
----------------------------------------------------------- 
name fullname          phone 
----------------------------------------------------------- 
NASA National Aeronautics and Space Administration 00000 
----------------------------------------------------------- 

Maintenant, je veux rechercher les données sous la table " ContactInfo "en utilisant la méthode suivante:

1) Peu importe que j'inscrive" NASA "ou" Administration Nationale de l'Aéronautique et de l'Espace "ou le numéro de téléphone, la ligne droite (dans cet exemple, juste la première ligne) doit être retournée à moi. 2) Lorsque je saisis «Administration nationale de l'aéronautique» ou «Administration nationale de l'espace» ou «Administration américaine de l'aéronautique et de l'espace» ou «NASA américaine» qui ne correspond pas exactement à la base de données, la première ligne doit être retourné à moi puisque le contenu de la première ligne sont liés à la chaîne demandée.

La manière dont deux peuvent être considérés comme la recherche obscure.

J'ai envisagé d'utiliser la "recherche contextuelle complète" telle que "Hpyer estraier" et "Lucene". Cependant j'ai trouvé que mon exigence est différente plus ou moins. Lorsque vous utilisez "Hyper estraier" ou "Lucene", les index doivent être construits d'abord en fonction du texte brut analysé. Puis commencez à chercher.

Est-ce que cela signifie que je devrais changer les données de ma base de données en plusieurs fichiers texte (chaque enregistrement de la table en un seul fichier), puis construire l'index en fonction de ces fichiers?

BTW, je viens de découvrir que MySQL supporte la recherche en texte intégral, mais nous devons gérer quelques caractères chinois, mais il semble que mysql supporte parfaitement les caractères chinois.

Alors, n'importe qui peut me donner une suggestion?

Répondre

0

Vous pouvez utiliser sphinx en conjonction avec mysql. sphinx est un outil autonome, mais il a un mode proxy mysql où il se comporte comme un serveur mysql et peut être interrogé avec n'importe quel connecteur mysql là-bas. Ou, en guise d'alternative, il y a un plugin de moteur de stockage sphinx pour mysql qui vous permet d'interroger sphinx avec votre connexion mysql actuelle et d'effectuer des jointures à d'autres tables.

Definetly pas une solution quich et sale mais il vaut un autre regard: http://sphinxsearch.com/

+0

Il semble que le sphinx ne supporte que php, mais notre application est construite sous java.Et je trouve un autre sphinx-4, quelle est la différence? – hguser

+0

Java n'a pas besoin de construire dans le support sphinx. Vous pouvez utiliser SphinxSE 'SE = Storage Engine' http://sphinxsearch.com/docs/current.html#sphinxse-using ou SphinxQL http://sphinxsearch.com/docs/current.html#sphinxql qui est un démon qui simule un vrai serveur MySQL et vous permet d'effectuer des requêtes. Les deux méthodes exigent que le démon sphinx soit opérationnel. SphinxQL est plus facile à configurer parce que SphinxSE vous oblige à recompiler MySQL avec le support sphinx mais SphinxSE est plus pratique à interroger puisque vous pouvez interroger les id_produits d'une recherche sphinx et rejoindre directement la table des produits en une seule étape. –

0

Vous pouvez utiliser quelque chose comme ça à cette fin:

SELECT * 
    FROM `ContactInfo` 
WHERE `name` LIKE '%your-query%' 
    OR `fullname` LIKE '%your-query%' 
    OR `phone` LIKE '%your-query%' 

Afin de soutenir votre cas n ° 2, vous devez remplacer tous les espaces your-query avec % pour permettre à tout -Les personnages combinaison de caractères entre la mots entrés. N'oubliez pas d'échapper l'entrée des utilisateurs pour empêcher l'injection SQL.

Et de mettre toutes vos données dans des fichiers texte (séparés) semble être très inefficace pour stocker des données.

+0

Pour le cas n ° 2, votre travail de suggestion pour le caractère anglais, mais il ne semble pas pour les caractères chinois.Depuis les mots anglais commencent et se terminent par un espace, mais le mot chinois ne le fait pas. – hguser

+0

Vous pourriez être capable de construire ceci en utilisant des expressions régulières avec le raccourci de limite de mot ('\ b'), comme documenté [ici] (http://unicode.org/reports/tr18/#Tailored_Word_Boundaries). – jwueller

+0

Merci, je vais essayer. Je me demande quelle efficacité peut-être mieux par rapport à la version complète du texte? – hguser