Zkoumali jsme důkladněji, jak funguje vyhledávání vah.
Podle dokumentů lze vám přiřadit váhy podle polí a dokonce jim lze přiřadit váhy a podobně můžeme použít trigramy filtrovat podle podobnosti nebo vzdálenosti.
Nespecifikujte však příklad použití těchto dvou a dále prozkoumejte, jak tomu rozumělo, ani jak fungují váhy.
Trocha logiky nám říká, že pokud hledáme společné slovo ve všech, všichni budeme mít hodnocení 0, podobnost se liší mnohem více než rozsahy, má však tendenci k nižším hodnotám tohoto rozsahu.
Nyní se textové vyhledávání, pokud rozumíme, provádí na základě textu obsaženého v polích, která chcete filtrovat, ještě více než v jazyce, který je umístěn v konfiguraci. Příkladem je, že použitý model při uvádění názvů měl pole názvu a pole obsahu, jejichž nejběžnější slova byla how change
, kontroluje vážená slova (rozsahy fungují jako dotaz, takže můžeme použít values
nebo values_list
pro přezkoumání pořadí a podobností, což jsou číselné hodnoty, můžeme zobrazit vážená slova zobrazením vektorového objektu), viděli jsme, že pokud byly přiděleny váhy, ale kombinace rozdělených slov:našli jsme 'perfil' a 'cambi', ale nenašli jsme 'cambiar' nebo 'como'; všechny modely však obsahovaly stejný text jako „lorem ipsun...“ a všechna slova této věty, pokud byla celá a se závažím B; Dospěli jsme k závěru, že vyhledávání se provádí na základě obsahu polí, aby bylo možné filtrovat více než jazyk, ve kterém vyhledávání konfigurujeme.
To znamená, že zde uvádíme kód, který používáme pro všechno.
Nejprve musíme použít Trigrams v rozsahu nezbytném k aktivaci databáze:
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension, TrigramExtension
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
...
TrigramExtension(),
UnaccentExtension(),
]
Import operací pro migraci z postgres
balíčky a spustit z libovolné migrace souborů .
Dalším krokem je změnit kód otázky tak, aby filtr vrátil jeden z dotazů, pokud druhý selže:
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]
Problém s výše uvedeným kódem byl prosakování jednoho dotazu za druhým, a pokud se zvolené slovo neobjeví v žádném ze dvou vyhledávání, problém je větší. Používáme Q
objekt, který chcete filtrovat pomocí OR
konektor, takže pokud jeden z nich nevrátí požadovanou hodnotu, pošlete druhý na místo.
S tím to stačí, nicméně jsou vítáni hloubkové objasnění toho, jak tyto závaží a trigramy fungují, aby bylo možné co nejlépe vysvětlit tuto novou výhodu, kterou nabízí nejnovější verze Django.