Tôi có thể có được kết hợp của chỉ mục toàn văn bản Postgres không?


7

Tôi có một chỉ mục fulltext trên một bảng. Có thể truy xuất tập hợp các thuật ngữ được sử dụng trong chỉ mục ( gisthoặc gin) không? Với tạ nếu có thể?

Làm rõ:

Nếu tôi có bảng sau:

create table "test" (id integer, thing tsvector);

Sau đó tôi tạo một chỉ số GIST trên đó:

create index thing_index on test using gist (thing);

Sau đó, một số dữ liệu:

insert into test (id, thing)
values (1, 'one'),(2, 'two'), (3, 'three'), (4, 'one'), (5, 'two');

Chỉ mục thing_indexsẽ chứa ánh xạ sau:

'one' => {1, 4}
'two' => {2, 5}
'three' => {3}

Tôi muốn nhận được phản hồi sau từ chỉ mục:

'one',
'two',
'three'

Thậm chí có thể với bảng xếp hạng:

'one' => 2
'two' => 2
'three' => 1

Tôi biết tôi có thể tự làm điều này bằng cách quét và xây dựng chỉ mục của riêng mình, nhưng tôi muốn đưa nó ra khỏi Postgres nếu có thể.


1
Bạn có ý nghĩa gì bởi "các thuật ngữ được sử dụng trong chỉ mục"? Một chỉ mục fulltext lập chỉ mục tất cả các từ trong cột.
Josh Berkus

1
Có thể đáng để giải thích một chút về câu hỏi của bạn, vì tôi nghi ngờ không ai rõ ràng về chính xác những gì bạn muốn, vì vậy họ đang gặp khó khăn khi trả lời.
Craig Ringer

Cảm ơn Josh và Craig, điều đó không xảy ra với tôi rằng câu hỏi của tôi có thể không rõ ràng. Tôi đã thêm một ví dụ làm việc.
Joe

Câu trả lời:


1

Nếu tôi hiểu chính xác câu hỏi của bạn và nó hoàn toàn không rõ ràng, bạn đang cố gắng lấy lại thông tin theo như những gì id được kết nối với một giá trị. Tôi không nghĩ rằng bạn chỉ có thể lấy nó từ chỉ mục trong PostgreSQL vì chỉ mục sẽ không chứa thông tin về khả năng hiển thị và do đó bạn sẽ có RẤT NHIỀU IO ngẫu nhiên và chờ đợi các platters bật.

Truy vấn cho trường hợp thử nghiệm của bạn là:

select thing, array_agg(id) from test group by thing;

Giả sử bạn đang ở một phiên bản đủ cao để có mảng_agg.

Trong hệ thống của tôi (9.1), điều này mang lại cho tôi:

chris=> select thing, array_agg(id) from test group by thing;
   thing  | array_agg 
 ---------+-----------
  'one'   | {1,4}
  'two'   | {2,5}
  'three' | {3}
 (3 rows)

đó là những gì bạn đang tìm kiếm, phải không?


Cảm ơn, điều đó có vẻ hy vọng. Tôi sẽ cho nó đi. Tôi đang trên 9.0 FWIW. Làm thế nào tôi có thể làm cho câu hỏi? Tôi đã đưa ra một đầu vào và đầu ra mẫu với lời giải thích về quá trình mà tôi muốn biến cái này thành cái khác.
Joe

Array_agg đã được giới thiệu Tôi nghĩ rằng trong 8.4 vì vậy bạn nên làm tốt. Câu hỏi không rõ ràng về việc bạn chỉ muốn loại tổng hợp này hay liệu bạn đang cố gắng xem chỉ mục nào nghĩ rằng một bảng được cho là chứa (thường là phần thay thế của những gì nó thực sự chứa).
Chris Travers

À. Vâng, tôi muốn chỉ số thực tế để tránh quét toàn bộ bảng. Tôi chỉ muốn truy cập vào chỉ mục đảo ngược như tính toán. Cuối cùng tôi đã đi một tuyến đường khác (tính toán của riêng tôi) nhưng nghĩ rằng nó đáng để thử miễn phí trước.
Joe

1
Trên PostgreSQL trước 9.2, không thể thực hiện chỉ mục và tránh bảng. Vào ngày 9.2 trở lên, tôi cho rằng bạn có thể hút bụi và giả sử không có truy vấn nào khác, bạn có thể sử dụng chỉ mục (vô hiệu hóa seq_scan). Tuy nhiên, quét tuần tự của bảng thực sự có thể nhanh hơn được đưa ra các cuộc thảo luận về pssql-general.
Chris Travers

1

Và thế còn:

SELECT * FROM ts_stat('SELECT thing FROM test')                 
ORDER BY nentry DESC, ndoc DESC, word                              
LIMIT 100;

Làm việc trong nháy mắt đối với tôi (trg.1.1) và hiển thị Danh sách các từ được sử dụng trong các tài liệu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.