2012-05-25 49 views
12

Tôi đã được tranh thủ để giúp đỡ về một dự án và tôi đang lặn trở lại vào PostgreSQL sau khi không làm việc với nó trong nhiều năm. Thiếu sử dụng sang một bên, tôi đã không bao giờ chạy vào sử dụng các lĩnh vực tsvector trước và bây giờ thấy mình phải đối mặt với một lỗi dựa trên chúng. Tôi đọc tài liệu về các loại lĩnh vực và mục đích của nó, nhưng tôi có một thời gian khó đào lên tài liệu hướng dẫn về cách 'đơn giản' khác với 'tiếng Anh' như tham số đầu tiên to_tsquery()"to_tsquery" trên tsvector mang lại kết quả khác nhau khi sử dụng "đơn giản" và "tiếng Anh"?

Ví dụ

> SELECT to_tsvector('mortgag') @@ to_tsquery('simple', 'mortgage') 
?column? 
---------- 
f 
(1 row) 

> SELECT to_tsvector('mortgag') @@ to_tsquery('english', 'mortgage') 
?column? 
---------- 
t 
(1 row) 

Tôi nghĩ rằng cả hai nên trả về đúng sự thật, nhưng rõ ràng là cả hai đều không đúng - tại sao?

Trả lời

18

Các FTS sử dụng dictionaries để bình thường hóa các văn bản:

12,6. Từ điển

Từ điển được sử dụng để loại bỏ những từ mà không cần được xem xét trong một tìm kiếm (từ dừng), và để bình thường lời sao cho các hình thức có nguồn gốc khác nhau của cùng một từ sẽ phù hợp. Từ được chuẩn hóa thành công được gọi là lexeme.

Vì vậy, các từ điển được sử dụng để ném ra những điều quá phổ biến hoặc vô nghĩa để xem xét trong một tìm kiếm (từ dừng) và bình thường hóa mọi thứ khác để thành phốthành phố, ví dụ, sẽ phù hợp mặc dù chúng là những từ khác nhau.

Chúng ta hãy xem xét một số đầu ra từ ts_debug và xem những gì đang xảy ra với các từ điển:

=> select * from ts_debug('english', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+----------------+--------------+----------- 
asciiword | Word, all ASCII | mortgage | {english_stem} | english_stem | {mortgag} 

=> select * from ts_debug('simple', 'mortgage'); 
    alias | description | token | dictionaries | dictionary | lexemes 
-----------+-----------------+----------+--------------+------------+------------ 
asciiword | Word, all ASCII | mortgage | {simple}  | simple  | {mortgage} 

ý rằng simple sử dụng từ điển simple trong khi english sử dụng từ điển english_stem.

Các simple dictionary:

hoạt động bằng cách chuyển đổi các dấu hiệu đầu vào để giảm trường hợp và kiểm tra nó chống lại một tập tin từ dừng lại. Nếu nó được tìm thấy trong tập tin thì một mảng trống được trả về, làm cho mã thông báo bị hủy bỏ. Nếu không, hình thức thấp hơn của từ được trả về như là từ điển chuẩn hóa.

Từ điển simple chỉ ném ra từ dừng, downcases và đó là về nó. Chúng ta có thể thấy sự đơn giản của chính mình:

=> select to_tsquery('simple', 'Mortgage'), to_tsquery('simple', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------- 
'mortgage' | 'mortgages' 

Từ điển simple quá đơn giản để xử lý số nhiều đơn giản.

Vì vậy, từ khóa này là gì english_stem tất cả về? Hậu tố "gốc" là từ bỏ: từ điển này áp dụng thuật toán gốc cho các từ để chuyển đổi (ví dụ) thành phốthành phố tương tự.Từ số fine manual:

12.6.6. Từ điển Snowball

Mẫu từ điển Snowball dựa trên dự án của Martin Porter, nhà phát minh thuật toán gốc của Porter phổ biến cho tiếng Anh. [...] Mỗi thuật toán hiểu cách giảm các dạng biến thể phổ biến của từ thành cơ sở hoặc gốc, chính tả trong ngôn ngữ của nó.

Và ngay dưới mà chúng ta thấy các english_stem từ điển:

CREATE TEXT SEARCH DICTIONARY english_stem (
    TEMPLATE = snowball, 
    Language = english, 
    StopWords = english 
); 

Vì vậy, các từ điển english_stem bắt nguồn từ và chúng ta có thể thấy điều đó xảy ra:

=> select to_tsquery('english', 'Mortgage'), to_tsquery('english', 'Mortgages'); 
to_tsquery | to_tsquery 
------------+------------ 
'mortgag' | 'mortgag' 

Tóm tắt điều hành: 'simple' ngụ ý kết hợp chữ đơn giản có đầu óc, 'english' áp dụng bắt nguồn từ (hy vọng) tạo ra kết hợp tốt hơn. Gốc xuất hiện thế chấp thành mortgag và điều đó mang lại cho bạn kết quả phù hợp.

+0

Tuyệt vời! Đó là chính xác những gì tôi đang tìm kiếm - Tôi sẽ phải dành nhiều thời gian hơn trong sách hướng dẫn. Cảm ơn bạn! – phatskat

+0

@mu quá ngắn Bạn có gặp phải vấn đề với postgresql 9.6.1 không, chẳng hạn như '你' trong 'to_tsvector (tiêu đề) @@ to_tsquery ('你')' sẽ không thể tìm thấy chuỗi chứa '你' trong '你 好嗎'? – Growler

+0

@Growler Chưa, âm thanh như một chủ đề hay cho một câu hỏi mới. –

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