Cách nhanh nhất để có được độ dài giao điểm của hai mảng văn bản trong PostgreSQL


7

Đây là những gì tôi hiện đang sử dụng:

CREATE FUNCTION array_intersect(a1 anyarray, a2 anyarray)
RETURNS anyarray AS
$$ 
  SELECT ARRAY(
    SELECT unnest($1)
    INTERSECT SELECT unnest($2)
    ORDER BY 1
  );
$$ LANGUAGE sql
IMMUTABLE STRICT;


--get the length:
select array_length ( array_intersect(array[...], array[...]), 1);

Có cách nào nhanh hơn không?


1
Không giống như nó cho mảng mục đích chung. Đối với mảng số nguyên, intarrayphần mở rộng cung cấp &toán tử, nhưng dường như không có một tổng quát nào cho tất cả các mảng mặc dù sự tồn tại của &&phép thử boolean cho các mảng chồng lấp. Thật tuyệt khi thêm, nhưng ... tốt, hãy xem mã nguồn C cho các hàm và toán tử mảng mục đích chung PostgreQuery để xem tại sao không có nhiều như bạn mong đợi. API mảng là khủng khiếp.
Craig Ringer

Cảm ơn Craig. Lý tưởng nhất là tôi đang cố gắng để có được sự tương đồng của Jaccard giữa hai mảng. Bất kỳ lời khuyên nào về việc mở rộng phần mềm smlar của Teodor để biên dịch trên Windows?
Neil McGuigan

Tôi đang vật lộn với vấn đề tương tự bây giờ. Tôi đã xem xét chuyển đổi các thành phần văn bản của tôi thành số nguyên để sử dụng các phần mở rộng lập chỉ mục số nguyên. Bạn đã bao giờ tìm thấy một cách để làm điều này một cách nhanh chóng?
Greg

Kiểu dữ liệu bạn đang sử dụng là gì? Làm thế nào lớn là các mảng?
Evan Carroll

Câu trả lời:


3
  1. Bạn nói rằng bạn đang tìm kiếm "Tương tự Jaccard giữa hai mảng"

    Bạn có thể xem xét MadLib cung cấp điều này nhưdist_jaccard()

    Khoảng cách Jaccard giữa hai vectơ varchar được coi là tập hợp.

  2. Bạn có thể muốn thử nó mà không có STRICT. Điều đó có thể làm chậm nó xuống.

  3. Bạn có thể muốn sử dụng INTERSECT ALLĐặc biệt nếu bạn biết bạn không có bản sao $1.

  4. Như Craig Ringer đã nói trong các ý kiến ​​bạn có thể muốn ra ngoài intarrayvà xem xét sử dụng &.

Để đưa ra một câu trả lời chính xác hơn ở đây,

  • Các kiểu dữ liệu là gì?
  • Có bao nhiêu yếu tố chúng ta đang nói về mỗi mảng?
  • Bao nhiêu loại trừ không INTERSECTcung cấp?
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.