Sphinx sans utiliser un ID d'incrément automatique

je suis actuel de la planification sur la création d'une base de données (+de 2 millions de lignes), avec une variété de données à partir de différentes sources. Je voudrais éviter de structurer la base de données autour des ID auto_ increment pour aider à prévenir les problèmes de synchronisation avec la réplication, et aussi parce que chaque élément inséré aura un code produit alphanumérique qui est garanti pour être unique - il me semble plus logique d'utiliser à la place.

je suis à la recherche d'un moteur de recherche pour indexer cette base de données avec Sphinx semble plutôt attrayant en raison de sa conception autour de l'indexation des bases de données relationnelles. Cependant, l'examen de divers tutoriels et de la documentation semble montrer que les conceptions de base de données dépendent d'un champ auto_ incrément sous une forme ou une autre et d'un plutôt bold statement dans la documentation disant que les ID du document doivent être 32/64bit entiers seulement ou les choses se cassent.

est-il possible d'avoir une base de données indexée par Sphinx sans augmentation automatique domaines comme la carte d'identité?

5
demandé sur squeeks 2009-10-29 19:07:04

4 réponses

sphinx exige seulement des ids pour être entier et unique, il ne se soucie pas si elles sont auto incrémentées ou non, donc vous pouvez déployer votre propre logique. Par exemple, produisez des hachages entiers pour vos clés de chaîne.

3
répondu user187291 2009-10-29 16:15:06

bien Sûr - c'est facile à contourner. Si vous avez besoin de créer vos propres IDs juste pour Sphinx et vous ne voulez pas qu'ils entrent en collision, vous pouvez faire quelque chose comme ça dans votre sphinx.conf (exemple de code pour MySQL)

source products {

  # Use a variable to store a throwaway ID value
  sql_query_pre = SELECT @id := 0 

  # Keep incrementing the throwaway ID.
  # "code" is present twice because Sphinx does not full-text index attributes
  sql_query = SELECT @id := @id + 1, code AS code_attr, code, description FROM products

  # Return the code so that your app will know which records were matched
  # this will only work in Sphinx 0.9.10 and higher!
  sql_attr_string = code_attr  
}

le seul problème est que vous avez encore besoin d'un moyen de savoir quels enregistrements ont été appariés par votre recherche. Sphinx retournera l'id (qui est maintenant sans signification) plus toutes les colonnes que vous marquez comme "attributs".

Sphinx 0.9.10 et ci-dessus sera en mesure de vous retourner votre code de produit dans le cadre des résultats de recherche parce qu'il a le soutien d'attributs de chaîne.

0.9.10 n'est pas encore un communiqué officiel mais il semble grand. Il semble que Zawodny l'exécute à la liste de Craig donc je ne serais pas trop nerveux de compter sur cette fonctionnalité.

17
répondu casey 2009-10-30 15:50:47

Sphinx ne dépend pas de l'incrément automatique , il suffit d'avoir des identificateurs de document entiers uniques. Peut-être que vous pouvez avoir un ID entier unique de substitution dans les tables pour travailler avec sphinx. Comme il est connu que entier les recherches sont plus rapides que alphanumérique recherches. BTW Quelle est la longueur du code alphanumérique du produit ur? tous les échantillons?

1
répondu Sabeen Malik 2009-10-29 16:38:17

je pense qu'il est possible de générer un flux XML à partir de vos données. Ensuite, créez L'ID via un logiciel (Ruby, Java, PHP).

regardez http://github.com/burke/mongosphinx

1
répondu chris 2010-05-13 23:25:56