2010-01-18 8 views
0

Je travaille actuellement sur un projet AppEngine, et j'aimerais mettre en œuvre la complétion automatique des termes de recherche. Les éléments qui peuvent être recherchés sont raisonnablement non équivoques et courts, donc je pensais à l'implémenter en donnant à chaque élément une liste de dactylogrammes incomplets. Donc, foobar obtiendrait une liste comme [f, fo, foo, foob, fooba, foobar]. Le texte de l'utilisateur dans la boîte de recherche est ensuite comparé à cette liste, et des correspondances positives sont suggérées.Comment formater les listes de pièces de complétion automatique de recherche?

Il y a quelques optimisations possibles dans cette liste que je pensais:

  • espaces Suppression des signes de ponctuation à partir des termes de recherche. Foo. Bar à FooBar.
  • Suppression des majuscules
  • Suppression des particules principales telles que "le", "a", "an". The Guy serait guy, et indexé comme [g, gu, guy].
  • Ajout d'une sous-chaîne plus longue que 2 ou 3 à la liste d'indexation. Donc The Guy serait indexé comme [gu, guy]. Je pensais que les suggestions qui ne correspondent qu'à la première lettre ne seraient pas aussi pertinentes.

Le terme de recherche d'utilisateur serait également formaté de cette manière, après quoi le DB serait recherché. En suggérant un terme de recherche, les particules, la ponctuation et les majuscules seraient ajoutées en fonction du nom complet de l'objet suggéré. Donc, la recherche de "the" ne donnerait aucune suggestion, mais la recherche de "The Gu .." ou "gu" suggérerait "The Guy".

Est-ce une bonne idée? Principalement: ce formatage aiderait-il, ou seulement causer des ennuis?

Répondre

2

J'ai déjà rencontré le même problème et la solution que j'ai adoptée était très similaire à votre idée. Je divise les éléments en mots, les convertis en minuscules, supprime les accents et crée une liste de démarrages. Par exemple, "Báz Bar" deviendrait ['b', 'ba', 'bar', 'baz'].

J'ai posté le code dans ce thread. Le champ de recherche of this site l'utilise. N'hésitez pas à l'utiliser si vous le souhaitez.

+0

Est-il utile de diviser les mots sur les espaces? Comment faire correspondre la chaîne lorsque l'utilisateur tape _both_ mots dans la boîte de recherche? Avez-vous besoin de créer une requête DB distincte pour chaque mot? Comme 'word1 dans startings + word2 dans startings + word3 etc ...' – noio

+1

Non, en fait vous pouvez juste cascader un filtre pour chaque mot: 'query.filter ('start' = 'mot1'). Filter ('start =' , 'word2') .... ' – jbochi