---
title: "Pencarian teks penuh"
version: 2.2
locale: id
source: https://docs.djangoproject.com/id/2.2/ref/contrib/postgres/search/
canonical: https://djangodocs.dev/id/2.2/ref/contrib/postgres/search/
---
# Pencarian teks penuh

Fungsi-fungsi basisdata dalam modul `django.contrib.postgres.search` kemudahan penggunaan  [full text search engine](https://www.postgresql.org/docs/current/textsearch.html) PostgreSQL.

Sebagai contoh dalam dokumen ini, kami akan menggunakan model ditentukan dalam [Membuat query](/id/2.2/topics/db/queries/).

> **See also**
>
> Untuk tinjauan tingkat-tinggi dari pencarian, lihat :doc:topic documentation .

## Pencarian `search`

Cara paling mudah menggunakan pencarian teks penuh adalah mencari istilah tunggal terhadap kolom tunggal dalam basisdata. Sebagai contoh:

```
>>> Entry.objects.filter(body_text__search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
```

Ini membuat sebuah `to_tsvector` dalam basisdata dari bidang `body_text` dan `plainto_tsquery` dari istilah pencarian `'Cheese'`, kedua menggunakan konfigurasi pencarian basisdata awalan. Hasil didapatkan dengan mencocokkan permintaan dan vektor.

Untuk menggunakan pencarian `search`, `'django.contrib.postgres'` harus berada dalam [`INSTALLED_APPS`](/id/2.2/ref/settings/#std-setting-INSTALLED_APPS) anda.

## `SearchVector`

#### `class SearchVector(\*expressions, config=None, weight=None)`

Pencarian terhadap bidang tunggal lebih hebat tetapi agak terbatas. Contoh-contoh `Entry` kami sedang cari milik sebuah `Blog`, yang mempunyai bidang `tagline`. Untuk meminta terhadap kedua bidang, gunakan `SearchVector`:

```
>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
```

Argumen-argumen pada `SearchVector` dapat berupa [`Expression`](/id/2.2/ref/models/expressions/#django.db.models.Expression) apapun atau nama dari sebuah bidang. Banyak argumen akan dihubungkan bersama menggunakan sebuah ruang sehingga pencarian dokumen menyertakan mereka semua.

Vektor `SearchVector` dapat dipadukan bersama-sama, mengizinkan anda menggunakan kembali mereka. Sebagai contoh:

```
>>> Entry.objects.annotate(
...     search=SearchVector('body_text') + SearchVector('blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
```

Lihat [Merubah konfigurasi pencarian](#postgresql-fts-search-configuration) dan [Meminta pembobotan](#postgresql-fts-weighting-queries) untuk sebuah penjelasan dari parameter `config` dan `weight`.

## `SearchQuery`

#### `class SearchQuery(value, config=None, search_type='plain')`

`SearchQuery` menterjemahkan istilah pengguna sediakan kedalam obyek permintaan pencarian yang basisdata bandingkan pada pencarian vektor. Secara awalan, semua kata pengguna sediakan dilewatkan melalui algoritma berasal, dan kemudian itu mencari kecocokan untuk semua istilah yang dihasilkan.

Jika `search_type` adalah `'plain'`, yang merupakan awalan, istilah-istilah diperlakukan sebagai kata kunci terpisah. Jika `search_type` adalah `'phrase'`, istilah-istilah diperlakukan sebagai frasa tunggal. Jika `search_type` adalah `'raw'`, kemudian anda dapat menyediakan permintaan pencarian dibentuk dengan istilah dan penghubung. Baca [Full Text Search docs](https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES) PostgreSQL untuk mempelajari tentang perbedaan dan sintaksis. Contoh-contoh:

```
>>> from django.contrib.postgres.search import SearchQuery
>>> SearchQuery('red tomato')  # two keywords
>>> SearchQuery('tomato red')  # same results as above
>>> SearchQuery('red tomato', search_type='phrase')  # a phrase
>>> SearchQuery('tomato red', search_type='phrase')  # a different phrase
>>> SearchQuery("'tomato' & ('red' | 'green')", search_type='raw')  # boolean operators
```

Istilah `SearchQuery` dapat dipadukan secara logika untuk menyediakan keluwesan lebih:

```
>>> from django.contrib.postgres.search import SearchQuery
>>> SearchQuery('meat') & SearchQuery('cheese')  # AND
>>> SearchQuery('meat') | SearchQuery('cheese')  # OR
>>> ~SearchQuery('meat')  # NOT
```

Lihat [Merubah konfigurasi pencarian](#postgresql-fts-search-configuration) untuk sebuah penjelasan dari parameter `config`.

> **New in Django 2.2**
>
> Parameter search\_type telah ditambahkan.

## `SearchRank`

#### `class SearchRank(vector, query, weights=None)`

Sejauh ini, kami telah mengembalikan hasil untuk kecocokan apapun diantara vektor dan permintaan adalah memungkinkan. Itu sepertinya akdan mungkin berharap mengurutkan hasil dengan memilih pertaliannya. PostgreSQL menyediakan fungsi peringkat yang memperhitungkan seberapa sering istilah-istilah permintaan muncul di dokumen, bagaimana menutup bersama istilah-istilah dalam dokumen, dan bagaimana penting bagian dari dokumen dimana mereka muncul. Pencocokan yang lebih baik, nilai tertinggi dari peringkat. Untuk diurutkan berdasarkan pertalian:

```
>>> from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
>>> vector = SearchVector('body_text')
>>> query = SearchQuery('cheese')
>>> Entry.objects.annotate(rank=SearchRank(vector, query)).order_by('-rank')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]
```

Lihat [Meminta pembobotan](#postgresql-fts-weighting-queries) untuk penjelasan dari parameter `weights`.

## Merubah konfigurasi pencarian

Anda dapat menentukan atribut `config` pada [`SearchVector`](#django.contrib.postgres.search.SearchVector) dan [`SearchQuery`](#django.contrib.postgres.search.SearchQuery) untuk menggunakan konfigurasi pencarian berbeda. Ini mengizinkan menggunakan pengurai bahasa berbeda dan dictionary sebagai ditentukan oleh basisdata:

```
>>> from django.contrib.postgres.search import SearchQuery, SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', config='french'),
... ).filter(search=SearchQuery('œuf', config='french'))
[<Entry: Pain perdu>]
```

Nilai dari `config` dapat juga disimpan dalam kolom lain:

```
>>> from django.db.models import F
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', config=F('blog__language')),
... ).filter(search=SearchQuery('œuf', config=F('blog__language')))
[<Entry: Pain perdu>]
```

## Meminta pembobotan

Setiap bidang mungkin tidak memiliki hubungan dalam sebuah permintaan, jadi anda dapat mensetel berat dari beragam vektor sebelum anda mamadukan mereka:

```
>>> from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector
>>> vector = SearchVector('body_text', weight='A') + SearchVector('blog__tagline', weight='B')
>>> query = SearchQuery('cheese')
>>> Entry.objects.annotate(rank=SearchRank(vector, query)).filter(rank__gte=0.3).order_by('rank')
```

Berat harus beupa satu dari huruf berikut: D, C, B, A. Secara awalan, berat ini mengacu pada angka `0.1`, `0.2`, `0.4`, dan `1.0`, masing-masing. Jika anda berharap pada berat mereka berbeda, lewatkan daftar dari float emapt kami ke [`SearchRank`](#django.contrib.postgres.search.SearchRank) sebagai `weights` dalam urutan sama diatas:

```
>>> rank = SearchRank(vector, query, weights=[0.2, 0.4, 0.6, 0.8])
>>> Entry.objects.annotate(rank=rank).filter(rank__gte=0.3).order_by('-rank')
```

## Penampilan

Konfigurasi basisdata khusus tidak diperlukan untuk menggunakan fungsi ini apapun, bagaimapun, jika anda sedang mencari lebih dari sedikit ratusan rekaman, anda mungkin berjalan kedalam masalah penampilan. Pencarian teks penuh adalah pengolahan lebih intensif daripada membandingkan ukuran dari integer, sebagai contoh.

Pada kegiatan dimana semua bidang anda sedang minta mengandung dalam satu model tertentu, anda dapat membuat sebuah indeks kegunaan yang cocok vektor pencarian anda ingin gunakan. Dokumentasi PostgreSQL mempunyai rincian pada [creating indexes for full text search](https://www.postgresql.org/docs/current/textsearch-tables.html#TEXTSEARCH-TABLES-INDEX).

### `SearchVectorField`

#### `class SearchVectorField`

Jika pendekatan ini menjadi terlalu lambat, anda dapat menambahkan `SearchVectorField` ke model anda. Anda akan butuh menjaga itu dikumpulkan dengan pemicu, sebagai contoh, seperti digambarkan dalam [PostgreSQL documentation](https://www.postgresql.org/docs/current/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS). Anda kemudian dapat meminta bidang seperti jika itu dinyatakan `SearchVector`:

```
>>> Entry.objects.update(search_vector=SearchVector('body_text'))
>>> Entry.objects.filter(search_vector='cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]
```

## Kemiripan trigram

Pendekatan lain untuk mencari adalah kemiripan trigram. Trigram adalah kelompok dari tiga karakter berurutan. Sebagai tambahan pada pencarian [`trigram_similar`](/id/2.2/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_similar), anda dapat menggunakan sepasang pernyataan lain.

Untuk menggunakan mereka, anda butuh mengaktifkan [pg\_trgm extension](https://www.postgresql.org/docs/current/pgtrgm.html) pada PostgreSQL. Anda dapat memasang itu menggunakan tindakan perpindahan [`TrigramExtension`](/id/2.2/ref/contrib/postgres/operations/#django.contrib.postgres.operations.TrigramExtension).

### `TrigramSimilarity`

#### `class TrigramSimilarity(expression, string, **extra)`

Menerima nama bidang atau pernyataan, dan string atau pernyataan. Mengembalikan kemiripan trigram diantara dua argumen.

Contoh penggunaan:

```
>>> from django.contrib.postgres.search import TrigramSimilarity
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
...     similarity=TrigramSimilarity('name', test),
... ).filter(similarity__gt=0.3).order_by('-similarity')
[<Author: Katy Stevens>, <Author: Stephen Keats>]
```

### `TrigramDistance`

#### `class TrigramDistance(expression, string, **extra)`

Menerima nama bidang atau pernyataan, dan string atau pernyataan. mengembalikan jarak trigram diantara dua argumen.

Contoh penggunaan:

```
>>> from django.contrib.postgres.search import TrigramDistance
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
...     distance=TrigramDistance('name', test),
... ).filter(distance__lte=0.7).order_by('distance')
[<Author: Katy Stevens>, <Author: Stephen Keats>]
```
