2017-09-10 3 views
1

Est-ce que quelqu'un sait quel plugin (avec Django) est meilleur pour gérer les recherches dynamiques comme StackOverflow? Quelque chose like this:Recherche dynamique comme stackoverflow pour django

<input type="text" value="how to [django] or [python] duplicate:yes is:answer" style="width: 50%"> 

Je pense que sur les requêtes complexes.

query = request.GET.get('q') 

text_query = # what regex here? 
tags_query = # 
is_duplicate = re.search(r'(?P<duplicate>\w+)', query) 

Question.objects.filter(...) 
Answer.objects.filter(...) 
+0

aucun plugin n'est vraiment nécessaire. Il pourrait relativement facilement être manipulé avec regex. Demandez-vous comment la requête ci-dessus pourrait être traitée comme un exemple? – Jonathan

+0

@Jonathan ah oui ... pouvez-vous donner un exemple comment faire cela? quelque chose comment trouver 'text_query = 'comment faire' et sinon .. –

Répondre

0
query = "how to [django] or [python] or [mu] duplicate:yes is:answer" 

tags = re.search(r'\[(\w+)\]((or \[(\w+)\])+)?', query) 
colons = re.findall(r'\w+:\w+', query) 

search = query.replace(tags.group(), '') 
for colon in colons: 
    search = search.replace(colon, '') 

print(search) # how to 

Ensuite, vous pouvez traiter séparément les étiquettes et pour effectuer des requêtes côlons.

Si vous souhaitez rechercher dans la base de données des questions tous les termes de la requête de recherche, vous pouvez faire quelque chose comme ceci. Il trouvera tout le texte qui contient tous les termes de recherche.

search = search.split() 

db_query = Q(text__icontains=search[0]) 
for term in search[1:]: 
    db_query = db_query | Q(text__icontains=term) 

Question.objects.filter(db_query) 
+0

que diriez-vous de 2 ou 3 requêtes? Par exemple: 'query =" left side [django] ou [python] ou [mu] duplicate: yes est: answer right side "', alors nous avons ici '' left side'' et '' right side'' si J'ai suivi votre réponse j'ai '' gauche du côté droit '_ (avec espace vide) _. Comment puis-je identifier «un côté gauche du côté droit» un par un. –

+0

@sanca le côté droit aurait-il une signification sémantique? Si vous faites la requête dans stackoverflow cela ne fait rien. Il va rechercher les entrées contenant 'left side side'' – Jonathan

+0

@SancaKembang J'ai mis à jour la réponse un peu plus pour la façon dont la requête serait du côté de la base de données. – Jonathan