2012-07-24 5 views
1

Je souhaite que l'utilisateur puisse rechercher d'autres utilisateurs sur plusieurs colonnes dans le modèle user. A savoir les champs first_name, last_name et email. Je suis en train de faire une recherche en texte intégral pour MySQL mais je ne suis pas convaincu que ce soit la bonne façon de procéder. Est-ce que quelqu'un sait comment la recherche en texte intégral MySQL se compare à Solr et à d'autres fournisseurs tiers?django + recherche dans la base de données

Je regarde searchify et websolr comme des potentiels. Mais pour qu'une table effectue une recherche en texte intégral sur 3 colonnes, cela en vaudrait-il la peine?

Répondre

3

La recherche dans la base de données elle-même est plutôt lente. L'approche recommandée utilise un moteur de recherche, comme Solr, Whoosh, etc. pour générer les index. est une application django très utile qui vous permet de résumer les moteurs de recherche et d'avoir des modèles à utiliser lors de l'indexation.

Donc, avec le modèle que vous pouvez avoir un modèle comme:

{{user.first_name}} 
{{user. last_name}} 
{{user.email}} 

Et il va générer la recherche que vous cherchez résultats.

+0

question si ... si je veux utiliser websolr ou l'une des alternatives, peut-il automatiquement des tables d'index de Base de données MySQL automatiquement? Je ne trouve pas d'information là-dessus ... – KVISH

+0

Ouais c'est la bonne chose à ce sujet. Jetez un oeil à la documentation de Haystack. Fondamentalement, vous créez un modèle comme celui que j'ai posté, puis exécutez une commande d'indexation; après cela, vous êtes prêt à partir. – leonsas

+0

En outre, à des fins de développement, je recommande le moteur de recherche Whoosh, qui est complètement écrit en Python, et je pense qu'il est beaucoup plus facile de le configurer et de le «jouer». – leonsas

2

Voilà comment je le faire

#search.py 
import re 

from django.db.models import Q 

def normalize_query(query_string, 
        findterms=re.compile(r'"([^"]+)"|(\S+)').findall, 
        normspace=re.compile(r'\s{2,}').sub): 
    return [normspace(' ', (t[0] or t[1]).strip()) for t in findterms(query_string)] 

def get_query(query_string, search_fields): 
    query = None 
    terms = normalize_query(query_string) 
    for term in terms: 
     or_query = None 
     for field_name in search_fields: 
      q = Q(**{"%s__icontains" % field_name: term}) 
      if or_query is None: 
       or_query = q 
      else: 
       or_query = or_query | q 
     if query is None: 
      query = or_query 
     else: 
      query = query & or_query 
    return query 

Et la vue:

# views.py 
from django.shortcuts import render_to_response 
from django.contrib.auth.models import User 

def search(request): 
    query = request.GET.get('q', '') 
    if query: 
     entry_query = get_query(query, ['first_name', 'last_name', 'email']) 
     users = User.objects.filter(entry_query).order_by('-pub_date') 
    else: 
     entries_list = [] 
    return render_response(request, 'blog/list.html', {'entries': entries_list}) 
+0

Quelle est la performance pour cela? – KVISH

+0

Je n'ai pas de site à fort trafic à vous dire, mais dans un site de trafic standard fonctionne vraiment bien! – nicowernli

Questions connexes