2017-08-24 2 views
2

J'ai un site Wagtail alimenté par Postgres et voudrais implémenter une recherche floue sur tous les documents. Cependant, selon wagtail docs "SearchField (partial_match = True) n'est pas géré." Est-ce que quelqu'un sait d'une manière que je peux mettre en application ma propre recherche de correspondance partielle? Je laisse cette question intentionnellement ouverte parce que je suis ouvert à presque toutes les solutions qui fonctionnent bien et qui sont assez évolutives.Recherche partielle correspondant dans Wagtail avec Postgres

+0

Vous mentionnez "recherche floue", mais c'est en fait quelque chose d'autre. La recherche floue n'est pas faite pour la saisie semi-automatique, mais pour les suggestions d'orthographe. Bien sûr, une combinaison des deux peut être faite, comme sur Google, où la saisie semi-automatique peut changer l'orthographe de la requête. Mais c'est un autre sujet. –

Répondre

1

Nous sommes actuellement en train de reconstruire l'API de recherche Wagtail afin de rendre la saisie semi-automatique utilisable à peu près de la même manière dans les backends.

Pour l'instant, vous pouvez utiliser directement le modèle IndexEntry qui stocke les données de recherche. Malheureusement, django.contrib.postgres.search ne contient pas un moyen de faire une requête de saisie semi-automatique, nous devons donc le faire nous-mêmes pour l'instant. Voici comment faire:

from django.contrib.postgres.search import SearchQuery 
from wagtail.contrib.postgres_search.models import IndexEntry 

class SearchAutocomplete(SearchQuery): 
    def as_sql(self, compiler, connection): 
     return "to_tsquery(''%s':*')", [self.value] 

query = SearchAutocomplete('postg') 
print(IndexEntry.objects.filter(body_search=query).rank(query)) 
# All results containing words starting with “postg” 
# should be displayed, sorted by relevance.