PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kết hợp bát quái với tìm kiếm được xếp hạng trong django 1.10

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Cách thoát dấu ngoặc đơn trong PostgreSQL

  2. Hội nghị PostgreSQL mùa xuân 2011, Hoa Kỳ / Canada

  3. Trình điều khiển QPSQL không được tải Qt

  4. Mức độ hiệu quả khi đặt hàng theo khoảng cách (toàn bộ bảng) trong geodjango

  5. Cách di chuyển từ SQLite sang PostgreSQL (Rails)