sql >> Databáze >  >> RDS >> PostgreSQL

Kombinujte trigram s hodnoceným vyhledáváním v django 1.10

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.



  1. Mohu použít databázi MySQL s aplikací App Engine

  2. Zobrazit mezery mezi daty v MySQL

  3. Stránkovat Wordpress $wpdb dotaz?

  4. Metodologie testování výkonu:Objevování nové cesty