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?
Đâ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