Je voudrais implémenter une fonction de recherche dans une application de blogging django. Le statu quo est que j'ai une liste de chaînes fournies par l'utilisateur et le jeu de requête est réduit par chaque chaîne pour inclure uniquement les objets qui correspondent à la chaîne.Comment implémenter la recherche en texte intégral dans Django?
Voir:
if request.method == "POST":
form = SearchForm(request.POST)
if form.is_valid():
posts = Post.objects.all()
for string in form.cleaned_data['query'].split():
posts = posts.filter(
Q(title__icontains=string) |
Q(text__icontains=string) |
Q(tags__name__exact=string)
)
return archive_index(request, queryset=posts, date_field='date')
Maintenant, si je ne voulais pas chaque mot do concaténer qui est recherché par un ET logique mais avec un OU logique? Comment ferais-je cela? Existe-t-il un moyen de faire cela avec les méthodes Queryset de Django ou faut-il revenir aux requêtes SQL brutes?
En général, est-ce une bonne solution de faire une recherche de texte intégral comme ceci ou recommanderiez-vous d'utiliser un moteur de recherche comme Solr, Whoosh ou Xapian. Quels sont leurs avantages?
Il devrait utiliser OU s'il veut une recherche en texte intégral. Son code est clair, mais la description est un peu confuse. –
Mais les instructions .filter() sont ET'ed ensemble, n'est-ce pas? Ainsi, chaque argument de recherche (mot) est recherché dans le titre de la publication OU le contenu OU dans les étiquettes associées. Mais pour apparaître comme résultat, un post doit avoir tous les arguments de recherche dans son titre OU son contenu OR tag. C'est bien et c'est exactement ce que je voulais accomplir. Je suis juste curieux de savoir comment implémenter qu'un résultat n'a besoin que d'un des mots pour être présent dans l'un de ses attributs (pas tous). – jnns