Chúng tôi đã điều tra để hiểu kỹ hơn về cách hoạt động của tìm kiếm.
Theo tài liệu bạn có thể được chỉ định trọng số theo các trường và chúng thậm chí có thể được chỉ định trọng số và tương tự, chúng ta có thể sử dụng bát quái để lọc theo độ tương tự hoặc khoảng cách.
Tuy nhiên, không chỉ rõ một ví dụ về việc sử dụng cả hai và điều tra thêm về nó cũng không hiểu là trọng số có tác dụng gì.
Một logic nhỏ cho chúng ta biết rằng nếu chúng ta tìm kiếm một từ chung trong tất cả, tất cả chúng ta sẽ xếp hạng 0, độ giống nhau thay đổi nhiều hơn so với phạm vi, tuy nhiên có xu hướng làm giảm giá trị của phạm vi đó.
Bây giờ, tìm kiếm văn bản, theo như chúng tôi hiểu, nó được thực hiện dựa trên văn bản có trong các trường bạn muốn lọc nhiều hơn so với ngôn ngữ được đặt trong cấu hình. Ví dụ là đặt tiêu đề, mô hình đã sử dụng có trường tiêu đề và trường nội dung, có các từ phổ biến nhất là how change
, xem xét các từ có trọng số (phạm vi hoạt động như truy vấn, vì vậy chúng tôi có thể sử dụng các giá trị values
Hoặc values_list
để xem lại thứ hạng và các điểm tương đồng, là các giá trị số, chúng ta có thể xem các từ có trọng số xem đối tượng vectơ), chúng tôi thấy rằng nếu trọng số được phân bổ, nhưng kết hợp của các từ đã tách:tìm thấy 'perfil' và 'cambi', tuy nhiên chúng tôi không tìm thấy 'cambiar' hoặc 'como'; tuy nhiên, tất cả các mô hình đều chứa cùng một văn bản là 'lorem ipsun ...', và tất cả các từ của câu đó nếu chúng là toàn bộ và có trọng số B; Chúng tôi kết luận với điều này rằng các tìm kiếm được thực hiện dựa trên nội dung của các trường để lọc nhiều hơn ngôn ngữ mà chúng tôi định cấu hình tìm kiếm.
Điều đó nói rằng, ở đây chúng tôi trình bày mã chúng tôi sử dụng cho mọi thứ.
Đầu tiên, chúng ta cần sử dụng Trigrams ở mức độ cần thiết để kích hoạt cơ sở dữ liệu:
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension, TrigramExtension
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
...
TrigramExtension(),
UnaccentExtension(),
]
Nhập hoạt động để di chuyển từ postgres
và chạy từ bất kỳ quá trình di chuyển tệp nào.
Bước tiếp theo là thay đổi mã của câu hỏi để bộ lọc trả về một trong các truy vấn nếu câu thứ hai không thành công:
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]
Vấn đề với đoạn mã trên là thấm hết truy vấn này đến truy vấn khác và nếu từ được chọn không xuất hiện trong bất kỳ tìm kiếm nào trong hai tìm kiếm thì vấn đề còn lớn hơn. Chúng tôi sử dụng Q
đối tượng cần lọc bằng OR
trình kết nối để nếu một trong hai không trả về giá trị mong muốn, hãy gửi đầu nối kia vào đúng vị trí.
Với điều này là đủ, tuy nhiên, chúng tôi hoan nghênh việc làm rõ sâu hơn về cách hoạt động của các quả cân và bát quái này, để khai thác tối đa lợi thế mới này được cung cấp bởi phiên bản Django mới nhất.