2016-09-12 22 views
5

Tôi đang chạy Django 1.10.1 so với Postgres 9.4. Máy chủ dàn dựng và môi trường dev của tôi có các máy chủ psql ở phiên bản 9.4.9 và việc sản xuất là một cá thể RDS ở 9.4.7. Có vẻ như SearchVectorField của tôi không lưu trữ cấu hình tìm kiếm được đưa ra trong sản xuất, mặc dù nó đang trong dàn dựng và dev, và nó có vẻ là một phiên bản (không, với sự khác biệt phiên bản và nó cũng làm việc trên 9.3. trong dàn dựng/dev) hoặc thực tế là sản xuất là trên RDS thay vì địa phương trên máy chủ.Tìm kiếm văn bản đầy đủ Django psql không khớp với từ không bắt đầu

Tôi đang sử dụng một cấu hình tùy chỉnh cho tìm kiếm toàn văn gọi unaccent, trông như thế này:

 Token  |  Dictionaries  
-----------------+----------------------- 
asciihword  | english_stem 
asciiword  | english_stem 
email   | simple 
file   | simple 
float   | simple 
host   | simple 
hword   | unaccent,english_stem 
hword_asciipart | english_stem 
hword_numpart | simple 
hword_part  | unaccent,english_stem 
int    | simple 
numhword  | simple 
numword   | simple 
sfloat   | simple 
uint   | simple 
url    | simple 
url_path  | simple 
version   | simple 
word   | unaccent,english_stem 

Unaccent được cài đặt trong cả hai môi trường, và các công trình trong cả hai môi trường.

Tôi đang lưu trữ các dữ liệu tìm kiếm trong một django.contrib.postgres.search.SearchVectorField trên mô hình Writer tôi:

class Writer(models.Model): 
    #... 
    search = SearchVectorField(blank=True) 

cột đó được cập nhật với các vector tìm kiếm sau:

writer_search_vector = (SearchVector('first_name', 'last_name', 'display_name', 
            config='unaccent', weight='A') + 
         SearchVector('raw_search_data', config='unaccent', weight='B')) 

bởi các tuyên bố sau, chạy định kỳ:

Writer.objects.update(search=search_utils.writer_search_vector) 

Và, vì một lý do nào đó, cấu hình được lưu trữ thành công trên máy chủ dàn dựng của tôi và trong dev, nhưng không phải trong sản xuất. Ví dụ, mã này sẽ trả về kết quả tương tự trong tất cả các môi trường:

In [3]: Writer.objects.annotate(searchy=SearchVector('last_name')).filter(searchy='kostenberger') 
Out[3]: <QuerySet []> 
In [4]: Writer.objects.annotate(searchy=SearchVector('last_name', config='unaccent')).filter(searchy='kostenberger') 
Out[4]: <QuerySet [<Writer: Andreas J. Köstenberger>, <Writer: Margaret Elizabeth Köstenberger>]> 

Nhưng trong dàn, tôi nhận được kết quả chính xác sau nếu tôi sử dụng vector lưu trữ:

In [5]: Writer.objects.filter(search='kostenberger') 
Out[5]: <QuerySet [<Writer: Andreas J. Köstenberger>, <Writer: Margaret Elizabeth Köstenberger>]> 

trong khi sản xuất, so với RDS ví dụ: tôi nhận được kết quả không chính xác sau đây:

In [5]: Writer.objects.filter(search='kostenberger') 
Out[5]: <QuerySet []> 

nhưng vẫn sản xuất, không có tác dụng nhưng tiếng Anh không ở trong đó sẽ khớp với phiên bản gốc của văn bản (bên dưới), nhưng không phải là phiên bản gốc (ở trên):

In [6]: Writer.objects.filter(search='kostenberg') 
Out[6]: <QuerySet [<Writer: Margaret Elizabeth Köstenberger>, <Writer: Andreas J. Köstenberger>]> 

Lưu ý rằng bảng cơ sở dữ liệu cho Writer trong hai môi trường giống hệt nhau cho thử nghiệm này.

Bất kỳ ý tưởng nào tại sao vectơ được lưu trữ không hoạt động trong quá trình sản xuất với cấu hình đúng, trong khi nếu tôi tạo véc-tơ khi đang di chuyển thì nó sẽ hoạt động?

Trả lời

2

Trên RDS Postgres, bạn không được phép thay đổi thông số default_text_search_config. Vì vậy, bạn phải định cấu hình tìm kiếm văn bản với mỗi truy vấn:

from django.contrib.postgres.search import SearchRank, SearchQuery 
… 
search_query = SearchQuery(value='kostenberger', config='unaccent') 
Writer.objects.filter(search=search_query) 
+1

Đây là nó! Cảm ơn, David Eyk! Truy vấn không được thiết lập với cấu hình đúng, và tôi đã tập trung vào bản thân tsvector. – ryanmrubin

Các vấn đề liên quan