Question

J'ai une table mysql, qui contient 40 millions de disques qui est peuplé par un processus sur lequel je ne contrôle pas. Les données sont ajoutées seulement une fois par mois. Ce tableau doit être recherche-mesure par la colonne Nom. Mais la colonne de nom contient le nom complet dans le format «Last First Middle.

Dans le sphinx.conf, j'ai

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

Comment puis-je utiliser la recherche pour la recherche par sphynx prenom et / ou nom? Je voudrais être en mesure de rechercher « Smith » que dans le premier nom?

Était-ce utile?

La solution

A en juger par les autres réponses, je peux avoir manqué quelque chose ... mais pour restreindre une recherche dans Sphinx à un champ spécifique, assurez-vous que vous utilisez l'extension (ou extended2) le mode de correspondance, puis utilisez la requête suivante chaîne:. @firstname Smith

Autres conseils

Fonctions par ligne dans les requêtes SQL sont toujours une mauvaise idée pour les tables qui peuvent se développer ensemble. Si vous voulez rechercher sur une partie d'une colonne, il doit être extrait vers sa propre colonne et indexée.

Je suggère, si vous avez le pouvoir sur le schéma (par opposition au processus de la population), l'insertion de nouvelles colonnes appelées OwnersFirstName et OwnersLastName avec un déclencheur mise à jour / insert qui extrait les informations pertinentes OwnersName et populats de façon appropriée les nouvelles colonnes .

Cela signifie que la charge de déterminer le prénom est seulement fait lorsqu'une ligne est modifiée, pas à chaque fois vous exécutez votre requête. C'est le bon moment pour le faire.

Vos requêtes deviennent incroyablement rapide. Et, oui, cela brise 3NF, mais la plupart des gens ne se rendent pas compte qu'il est normal de le faire pour des raisons de performance, à condition que vous comprenez les conséquences. Et, étant donné que les nouvelles colonnes sont contrôlées par les déclencheurs, la duplication des données qui serait source de préoccupation est « propre ».

La plupart des problèmes que les gens ont des bases de données est la vitesse de leurs requêtes. Consacrer un peu d'espace disque pour gagner une grande quantité d'amélioration de la performance est généralement correct.

Si vous avez absolument pas pouvoir sur le schéma même, une autre possibilité est de créer votre propre base de données avec le schéma « correct » et remplir périodiquement à partir de la base de données réelle. interroger ensuite la vôtre. Cela peut impliquer un peu juste de transfert de données chaque mois mais si la première option est la meilleure, si on le laisse.

Vous pouvez utiliser pour obtenir les sous-chaîne parties du champ que vous souhaitez rechercher, mais qui va ralentir le processus. La requête ne peut pas utiliser tout type d'index pour faire la comparaison, il doit toucher chaque enregistrement de la table.

Le mieux serait de ne pas stocker plusieurs valeurs dans le même domaine, mais mettre les composants de nom dans trois champs distincts. Lorsque vous stockez plus d'une valeur dans un champs, il est presque toujours des difficultés pour accéder aux données. Je vois encore et dans différents forums ...

Ceci est un problrm intraitable parce que les noms fulll peut contenir des préfixes, suffixes, prénoms et pas prénoms, composites noms et prénoms avec et sans traits d'union, etc. Il n'y a aucun moyen raisonnable de le faire avec une fiabilité à 100%

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top