Nə üçün tam mətn axtarışı

Səhifələmə və axtarış dərsində sadə SearchVector nümunəsi görmüsünüz. Burada onu dərinləşdiririk: config, sıralama, GinIndex, trigram və işıqlandırma.

icontains hər sətirdə alt sətri axtarır. shoes ilə shoe fərqli sözlərdir, nəticələrin sırası yoxdur, böyük cədvəldə isə ardıcıl skan gedir. PostgreSQL isə mətni leksemlərə çevirir:

sql
SELECT to_tsvector('english', 'Running shoes for runners');
-- 'run':1,5 'shoe':2

SELECT websearch_to_tsquery('english', '"running shoes" -boots');
-- 'run' <-> 'shoe' & !'boot'
Məqalə, tsvector, GIN indeks, tsquery və sıralama
Məqalə, tsvector, GIN indeks, tsquery və sıralama

💡 Tam mətn axtarışı yalnız PostgreSQL-də var. django.contrib.postgres INSTALLED_APPS-a əlavə olunmalıdır.

SearchVector və SearchQuery

python
# settings.py
INSTALLED_APPS = [
    # ...
    "django.contrib.postgres",
    "articles",
]

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        "NAME": "shop",
        # USER, PASSWORD, HOST from environment
    }
}
python
from django.contrib.postgres.search import SearchVector

from articles.models import Article

vector = SearchVector("title", "body", config="english")

found = Article.objects.annotate(search=vector).filter(search="django indexes")

config mətnin dilini seçir. Vektor və sorğu üçün eyni olmalıdır, yoxsa leksemlər uyğun gəlməyə bilər.

python
from django.contrib.postgres.search import SearchQuery

SearchQuery("red tomato")                          # plain: all words
SearchQuery("red tomato", search_type="phrase")    # words side by side
SearchQuery("red & tomato", search_type="raw")     # raw tsquery syntax
SearchQuery('"red tomato" -green', search_type="websearch")