Kami menyelidiki lebih teliti memahami cara kerja pencarian bobot.
Menurut dokumen Anda dapat diberi bobot sesuai dengan bidangnya dan mereka bahkan dapat diberi bobot, dan kita juga dapat menggunakan trigram untuk memfilter berdasarkan kesamaan atau jarak.
Namun tidak menentukan contoh penggunaan keduanya dan menyelidiki lebih lanjut untuk memahaminya atau bobot yang berfungsi.
Sedikit logika memberitahu kita bahwa jika kita mencari kata yang sama di semua kita semua akan peringkat 0, kesamaan bervariasi lebih dari rentang, namun cenderung menurunkan nilai rentang itu.
Sekarang, pencarian teks, sejauh yang kami pahami, dilakukan berdasarkan teks yang terdapat di bidang yang ingin Anda filter bahkan lebih banyak daripada bahasa yang ditempatkan dalam konfigurasi. Contohnya adalah meletakkan judul, model yang digunakan memiliki bidang judul dan bidang konten, yang kata-katanya paling umum adalah how change
, meninjau kata-kata berbobot (rentang berfungsi sebagai kueri, sehingga kita dapat menggunakan values
atau values_list
untuk meninjau peringkat dan persamaan, yang merupakan nilai numerik, kita dapat melihat kata-kata berbobot dengan melihat objek vektor), kami melihat bahwa jika bobot dialokasikan, tetapi kombinasi kata-kata yang dipisah:ditemukan 'perfil' dan 'cambi', namun kami tidak menemukan 'kambiar' atau 'como'; namun, semua model memiliki teks yang sama dengan 'lorem ipsun ...', dan semua kata dalam kalimat itu jika utuh dan dengan bobot B; Kami menyimpulkan dengan ini bahwa pencarian dilakukan berdasarkan konten bidang untuk memfilter lebih dari bahasa yang kami gunakan untuk mengonfigurasi pencarian.
Yang mengatakan, di sini kami menyajikan kode yang kami gunakan untuk semuanya.
Pertama, kita perlu menggunakan Trigram sejauh yang diperlukan untuk mengaktifkan database:
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension, TrigramExtension
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
...
TrigramExtension(),
UnaccentExtension(),
]
Operasi impor untuk migrasi dari postgres
paket dan jalankan dari migrasi file apa pun .
Langkah selanjutnya adalah mengubah kode pertanyaan sehingga filter mengembalikan salah satu kueri jika yang kedua gagal:
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]
Masalah dengan kode di atas merembes satu demi satu permintaan, dan jika kata yang dipilih tidak muncul di salah satu dari dua pencarian, masalahnya lebih besar . Kami menggunakan Q
objek untuk difilter menggunakan OR
konektor sehingga jika salah satu dari keduanya tidak mengembalikan nilai yang diinginkan , kirim yang lain ke tempatnya.
Dengan ini sudah cukup, namun mereka menyambut klarifikasi mendalam tentang bagaimana bobot dan trigram ini bekerja, untuk mengungkapkan sebagian besar keuntungan baru yang ditawarkan oleh versi terbaru Django.