Nous avons étudié de manière plus approfondie le fonctionnement de la recherche.
Selon documents on peut vous attribuer des pondérations en fonction des champs et on peut même leur attribuer des pondérations, et de même nous pouvons utiliser trigrammes pour filtrer par similarité ou distance.
Cependant, ne spécifiez pas d'exemple d'utilisation des deux et approfondissez vos recherches, ni sur le fonctionnement des poids.
Un peu de logique nous dit que si nous cherchons un mot commun dans tous nous serons tous rangs 0, la similarité varie beaucoup plus que les plages, cependant tend à baisser les valeurs de cette plage.
Maintenant, la recherche de texte, pour autant que nous comprenions, elle est effectuée en fonction du texte contenu dans les champs que vous souhaitez filtrer encore plus que dans la langue qui est placée dans la configuration. Par exemple, en mettant des titres, le modèle utilisé avait un champ de titre et un champ de contenu, dont les mots les plus courants étaient how change
, en examinant les mots pondérés (les plages fonctionnent comme une requête, nous pouvons donc utiliser des values
ou values_list
pour examiner les rangs et les similitudes, qui sont des valeurs numériques, nous pouvons afficher les mots pondérés en visualisant l'objet vectoriel), nous avons vu que si des poids étaient attribués, mais des combinaisons de mots divisés :trouvé 'perfil' et 'cambi', cependant nous n'avons pas trouvé 'cambiar' ou 'como'; cependant, tous les modèles contenaient le même texte que « lorem ipsun... », et tous les mots de cette phrase s'ils étaient entiers et de poids B; Nous concluons avec cela que les recherches sont effectuées en fonction du contenu des champs pour filtrer plus que la langue avec laquelle nous configurons les recherches.
Cela dit, nous présentons ici le code que nous utilisons pour tout.
Tout d'abord, nous devons utiliser Trigrams dans la mesure nécessaire pour activer la base de données :
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension, TrigramExtension
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
...
TrigramExtension(),
UnaccentExtension(),
]
Opérations d'importation pour la migration depuis postgres
packages et exécuter à partir de n'importe quelle migration de fichier .
L'étape suivante consiste à modifier le code de la question afin que le filtre renvoie l'une des requêtes si la seconde échoue :
def get_queryset(self):
search_query = SearchQuery(self.request.GET.get('q', ''))
vector = SearchVector(
'name',
weight='A',
config=settings.SEARCH_LANGS[settings.LANGUAGE_CODE],
) + SearchVector(
'content',
weight='B',
config=settings.SEARCH_LANGS[settings.LANGUAGE_CODE],
)
if self.request.user.is_authenticated:
queryset = Article.actives.all()
else:
queryset = Article.publics.all()
return queryset.annotate(
rank=SearchRank(vector, search_query)
similarity=TrigramSimilarity(
'name', search_query
) + TrigramSimilarity(
'content', search_query
),
).filter(Q(rank__gte=0.3) | Q(similarity__gt=0.3)).order_by('-rank')[:20]
Le problème avec le code ci-dessus s'infiltrait une requête après l'autre, et si le mot choisi n'apparaît dans aucune des deux recherches, le problème est plus important. Nous utilisons un Q
objet à filtrer à l'aide d'un OR
connecteur de sorte que si l'un des deux ne renvoie pas une valeur souhaitée, envoyer l'autre en place.
Avec cela suffit, cependant ils sont les bienvenus des clarifications approfondies sur le fonctionnement de ces poids et trigrammes, pour expliquer au mieux ce nouvel avantage offert par la dernière version de Django.