5

Tôi đang phát triển một trang web bài viết đơn giản bằng tiếng Bồ Đào Nha Bồ Đào Nha. Tính năng tìm kiếm dựa trên tìm kiếm toàn văn, nhưng nó không trả lại kết quả mong đợi.Không thể nhận được kết quả phù hợp từ tìm kiếm toàn văn sau bưu điện

Tôi đã thực hiện điều này trên postgresql. Dưới đây là bảng đơn giản:

Artigos 
-id 
-title -- article title 
-intro -- article introduction 
-content -- article body 
-publishdate -- date of launch 
-artigosts -- this will work as our fts index. 

Sau khi tạo bảng, tôi chạy:

UPDATE artigos SET artigosts = 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') || 
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C'); 

CREATE INDEX artigosts_idx ON artigos USING gist (artigosts); 

CREATE TRIGGER artigosts_tg 
BEFORE INSERT OR UPDATE ON artigos 
FOR EACH ROW EXECUTE PROCEDURE 
    tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content'); 

Vâng, tôi có ý định sử dụng weightning đơn giản trên các tìm kiếm. Đã tạo chỉ mục để tăng tốc, trình kích hoạt, vì vậy tôi có thể chèn và cập nhật mà không phải lo lắng về việc tạo lại chỉ mục, v.v.

Vâng, theo hiểu biết của tôi, mọi thứ đều ổn. Nhưng kết quả thì không. Một ví dụ đơn giản.

Giả sử tôi có "... banco de dados ... no banco ..." là nội dung một bài viết. Khi tôi làm:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts; 

Nó trả về bộ trống. Tôi đã kiểm tra cột ts_vector và thấy các vị từ 'banc' và 'dad'. Nhưng tôi vẫn không thể hiểu tại sao nó không trả lại hàng chứa bài viết đã đề cập.

Ai đó có thể mang ánh sáng vào câu hỏi này không?

+0

Đã chơi với các cấu hình khác nhau có sẵn trên máy chủ. Tôi nghĩ đó là vấn đề từ các từ điển và từ dừng có sẵn.Có ai biết làm thế nào để lập bản đồ trên chars (như áéóôú) để vectơ? – Dave

Trả lời

4

Lý do cho điều này có thể do từ điển mặc định của bạn được đặt thành tiếng Anh. Hãy thử các truy vấn sau đây để xác định xem đó có thực sự là trường hợp không.

SELECT * FROM ts_debug('banco de dados'); 

Truy vấn này sẽ hiển thị cách từ điển phân tích cụm từ tìm kiếm của bạn. Nó sẽ cung cấp các từ vựng "banco", "de" và "dado". Vì vậy, những gì bạn đang thực sự tìm kiếm sẽ không tồn tại trong chỉ mục và bạn sẽ nhận được 0 kết quả.

Bây giờ thử điều này:

SELECT * FROM ts_debug('portuguese', 'banco de dados'); 

Cần trả lại lexemes mà tồn tại trong chỉ mục, "banc" và "cha". Nếu đó là trường hợp thì bạn có thể chỉ cần thay đổi truy vấn tìm kiếm của bạn để có được kết quả phù hợp.

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts; 
+0

Thx để trả lời. Vâng, tôi nhận ra từ điển chính là tiếng Anh. Và tiếng Bồ Đào Nha cho từ điển, mặc dù hiện tại, hút. Tôi có thể đạt được kết quả tốt nhất bằng cách sử dụng cấu hình SIMPLE. Vấn đề chính là việc sử dụng các nhân vật đặc biệt, như áéóíúçãõ, những thứ được sử dụng rất nhiều trên tiếng Bồ Đào Nha. Và một số từ vựng không được phân tích cú pháp, nhưng hầu hết các từ ngữ được phân tích cú pháp đúng, do đó, hiện tại nó đáp ứng một phần nhu cầu của tôi. – Dave

+0

@Dave - Tôi đã không thử điều này với bất kỳ ngôn ngữ nào khác ngoài tiếng Anh, nhưng bạn luôn có thể sử dụng một từ điển ispell với một dự phòng trên snowballer. Từ điển Bồ Đào Nha có sẵn trực tuyến: http://lasr.cs.ucla.edu/geoff/ispell-dictionaries.html#Portlish-dicts – thetaiko

+0

Thx để trả lời nhanh, nhưng tôi ước tôi có thể thay đổi các cài đặt đó trên máy chủ của tôi. Thật không may thay đổi các thuộc tính dict, fallbacks, các tệp và vv không phải là một tùy chọn cho tôi trên máy chủ cụ thể đó. Nhưng một lần nữa, thx cho những lời khuyên. – Dave

1

Có thể là muộn cho bạn. Và tôi không có đủ danh tiếng để thêm nhận xét đơn giản ...

Đối với các ký tự đặc biệt, tôi không được đặt chúng trước khi chuyển sang tsvector.

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ')) 

Vì vậy, tôi nhận được:

"'aeoiucao':4 'banco':1 'dados':3 'de':2" 

Bạn cần phải:

CREATE EXTENSION unaccent; 

... như postgres người dùng. Và chắc chắn, bạn phải unaccent tsquery của bạn cũng

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