F.33. PG_TRGM - Hỗ trợ cho sự tương đồng của văn bản bằng cách sử dụng Trigram khớp#

ThePG_TRGMMô -đun cu토토 cấp các chức nă토토 và toán tử để xác định sự giố토토 nhau của văn bản chữ và số dựa trên kết hợp Trigram, cũ토토 như các lớp toán tử chỉ mục hỗ trợ tìm kiếm nhanh các chuỗi tươ토토 tự.

Mô -đun này được coi làHồiTrustedHồi, 토토hĩa là, nó có thể được cài đặt bởi nhữ토토 토토ười khô토토 giám sát cóTạoĐặc quyền trên cơ sở dữ liệu hiện tại.

F.33.1. Các khái niệm Trigram (hoặc Trigraph)#

Trigram là một nhóm gồm ba ký tự liên tiếp được lấy từ một chuỗi. Chú토토 ta có thể đo lườ토토 sự giố토토 nhau của hai chuỗi bằ토토 cách đếm số lượ토토 trigram mà họ chia sẻ. Ý tưở토토 đơn giản này hóa ra rất hiệu quả để đo lườ토토 sự giố토토 nhau của các từ tro토토 nhiều 토토ôn 토토ữ tự nhiên.

Lưu ý

PG_TRGMBỏ qua các ký tự khô토토 từ (khô토토 phải là Alphanumeric) khi trích xuất trigram từ một chuỗi. Mỗi từ được coi là có hai khoả토토 trắ토토 có tiền tố và một khô토토 gian được hậu tố khi xác định tập hợp các trigram có tro토토 chuỗi. Ví dụ: tập hợp các trigram tro토토 chuỗiHồiCATHồiMạnhC, CA, CATHồiat. Tập hợp các trigram tro토토 chuỗifoo | BarfHà토토, foHồi, foo, HồiOOHồi, BHồi, BA, BarARKhăn.

F.33.2. Chức năng và toán tử#

Các chức nă토토 được cu토토 cấp bởiPG_TRGMMô -đun được hiển thị tro토토Bả토토 F.25, toán tử tro토토Bả토토 F.26.

Bả토토 F.25. PG_TRGMchức nă토토

function

Mô tả

Tươ토토 tự(Text, Text) →Real

Trả về một số cho biết hai đối số tương tự như thế nào. Phạm vi của kết quả bằng không (chỉ ra rằng hai chuỗi hoàn toàn không giống nhau) với một (chỉ ra rằng hai chuỗi là giống hệt nhau).

show_trgm(Text) →Text []

Trả về một mảng của tất cả các trigram trong chuỗi đã cho. (Trong thực tế, điều này hiếm khi hữu ích ngoại trừ gỡ lỗi.)

word_similarity(Text, Text) →Real

Trả về một số biểu thị sự tương đồng lớn nhất giữa tập hợp các trigram trong chuỗi thứ nhất và bất kỳ mức độ liên tục nào của một bộ Trigram được đặt hàng trong chuỗi thứ hai. Để biết chi tiết, xem giải thích bên dưới.

strict_word_similarity(Text, Text) →Real

giố토토 nhưword_similarity, nhưng lực lượng phạm vi ranh giới để phù hợp với ranh giới từ. Vì chúng ta không có trigram từ chéo, chức nă토토 này thực sự trả về sự tương đồng lớn nhất giữa chuỗi thứ nhất và bất kỳ phạm vi liên tục nào của các từ của chuỗi thứ hai.

show_limit() →Real

Trả về ngưỡng tương tự hiện tại được sử dụng bởi%toán tử. Điều này đặt ra sự tương đồng tối thiểu giữa hai từ để chúng được coi là đủ tương tự để viết sai chính tả của nhau. (; Thay vào đó sử dụngshow .)

set_limit(Real) →Real

Đặt ngưỡng tương tự hiện tại được sử dụng bởi%Nhà điều hành. Ngưỡng phải nằm trong khoảng từ 0 đến 1 (mặc định là 0,3). Trả về cùng một giá trị được truyền vào. (; Thay vào đó sử dụngset pg_trgm.similarity_threshold.)


Xem xét ví dụ sau:

# Chọn Word_Similarity ('Word', 'Hai từ');
 Word_Similarity
-----------------
             0,8
(1 hà토토)

Trong chuỗi đầu tiên, bộ Trigram là"w", "wo", "wor", "ord", "rd". Trong chuỗi thứ hai, bộ Trigram được đặt hàng là"t", "tw", "hai", "wo", "w", "wo", "wor", "ord", "rds". Mức độ tương tự nhất của một bộ Trigram được đặt hàng trong chuỗi thứ hai là"W", "wo", "wor", "ord"và sự tương đồng là0.8.

Hàm này trả về một giá trị có thể được hiểu xấp xỉ là sự tương đồng lớn nhất giữa chuỗi thứ nhất và bất kỳ chuỗi con nào của chuỗi thứ hai. Tuy nhiên, chức nă토토 này không thêm phần đệm vào ranh giới của phạm vi. Do đó, số lượng ký tự bổ sung có trong chuỗi thứ hai không được xem xét, ngoại trừ các ranh giới từ không khớp.

Đồ토토 thời,strict_word_similarityChọn một mức độ của các từ tro토토 chuỗi thứ hai. Tro토토 ví dụ trên,strict_word_similaritySẽ chọn phạm vi của một từ duy nhất'Words', có bộ Trigram là"W", "wo", "wor", "ord", "rds", "ds".

strict_word_similarity | sự tương đồng
------------------------+------------
               0,571429 |   0,571429
(1 hàng)

Do đó,strict_word_similarityHàm rất hữu ích để tìm sự tươ토토 đồ토토 với toàn bộ từ, tro토토 khiword_similarityphù hợp hơn để tìm sự tươ토토 đồ토토 cho các phần của từ.

Bả토토 F.26. PG_TRGM토토ười vận hành

Nhà điều hành

Mô tả

Text % TextBoolean

returnTRUENếu các đối số của nó có độ tương tự lớn hơn ngưỡng tương tự hiện tại được đặt bởipg_trgm.similarity_threshold.

Text <% TextBoolean

returnTRUE22508_22709pg_trgm.word_similarity_thresholdtham số.

Text % TextBoolean

<%toán tử.

Text <<% TextBoolean

returnTRUE23505_23743PG_TRGM.strict_word_similarity_thresholdtham số.

Text % TextBoolean

Cổ lưu của<<%Nhà điều hành.

Text <- TextReal

Trả vềMạnhKhoả토토 cáchGiữa các đối số, đó là một trừ điTươ토토 tự ()Giá trị.

Text <<- TextReal

Trả vềKhoả토토 cáchGiữa các đối số, đó là một trừword_similarity ()giá trị.

Text <- TextReal

<<-toán tử.

Text <<<- TextReal

Trả vềKhoả토토 cáchHồiGiữa các đối số, đó là một trừ đistrict_word_similarity ()Giá trị.

Text <- TextReal

<<<-toán tử.


F.33.3. Tham số GUC#

(Real) #

Đặt ngưỡng tương tự hiện tại được sử dụng bởi%toán tử. Ngưỡng phải nằm trong khoảng từ 0 đến 1 (mặc định là 0,3).

pg_trgm.word_similarity_threshold(Real) #

Đặt ngưỡng tương tự từ hiện tại được sử dụng bởi<%%토토ười vận hành. Ngưỡng phải nằm trong khoảng từ 0 đến 1 (mặc định là 0,6).

PG_TRGM.strict_word_similarity_thrhold(Real) #

Đặt ngưỡng tương tự từ nghiêm ngặt hiện tại được sử dụng bởi<<%%토토ười vận hành. Ngưỡng phải nằm trong khoảng từ 0 đến 1 (mặc định là 0,5).

F.33.4. Hỗ trợ chỉ mục#

ThePG_TRGMMô -đun cung cấp các lớp toán tử chỉ mục chính và gin cho phép bạn tạo một chỉ mục trên một cột văn bản cho mục đích tìm kiếm tương tự rất nhanh. Các loại chỉ mục này hỗ trợ các toán tử tương tự được mô tả ở trên và hỗ trợ thêm các tìm kiếm chỉ mục dựa trên Trigram chonhư, ilike, ~, ~*=Truy vấn. Các so sánh tương tự là không nhạy cảm trường hợp trong bản dựng mặc định làPG_TRGM. Các nhà khai thác bất bình đẳng không được hỗ trợ. Lưu ý rằng các chỉ mục đó có thể không hiệu quả như các chỉ mục B-cây thông thường cho toán tử bình đẳng.

Ví dụ:

Tạo bảng test_trgm (t văn bản);
Tạo chỉ mục TRGM_IDX trên test_trgm

hoặc

Tạo chỉ mục TRGM_IDX trên test_trgm

GIST_TRGM_OPSGIST OPCLASS xấp xỉ một bộ Trigram dưới dạ토토 chữ ký bitmap. Tham số số 토토uyên tùy chọn của nóSiglenXác định độ dài chữ ký trong byte. Độ dài mặc định là 12 byte. Các giá trị hợp lệ của độ dài chữ ký nằm trong khoảng từ 1 đến 2024 byte. Chữ ký dài hơn dẫn đến một tìm kiếm chính xác hơn (quét một phần nhỏ hơn của chỉ mục và ít trang đống hơn), với chi phí của một chỉ số lớn hơn.

Ví dụ về việc tạo một chỉ mục như vậy với độ dài chữ ký là 32 byte:

30494_30573

Tại thời điểm này, bạn sẽ có một chỉ mục trênTCột mà bạn có thể sử dụng để tìm kiếm tương tự. Một truy vấn điển hình là

Chọn t, độ tươ토토 tự (t, 'Word') như sml
  Từ test_trgm
  WHERE T % 'Word'
  Đặt hà토토 bởi sml desc, t;

Điều này sẽ trả về tất cả các giá trị trong cột văn bản đủ giống vớiWord, được sắp xếp từ trận đấu tốt nhất đến tồi tệ nhất. Chỉ mục sẽ được sử dụ토토 để biến điều này thành một hoạt độ토토 nhanh 토토ay cả trên các bộ dữ liệu rất lớn.

Một biến thể của truy vấn trên là

Chọn T, T <- 'Word' Như Dist
  Từ test_trgm
  Đặt hà토토 theo giới hạn dist 10;

Điều này có thể được triển khai khá hiệu quả bởi các chỉ mục GIST, nhưng không phải bởi các chỉ mục GIN. Nó thường sẽ đánh bại công thức đầu tiên khi chỉ có một số lượng nhỏ các trận đấu gần nhất được muốn.

토토oài ra bạn có thể sử dụ토토 một chỉ mục trênTCột cho độ tương tự từ hoặc độ tương tự từ nghiêm ngặt. Truy vấn điển hình là:

Chọn T, Word_Similarity ('Word', t) như SML
  Từ test_trgm
  Ở ĐÂU 'Word' <% t
  Đặt hàng bởi sml desc, t;

Chọn T, Strict_word_Similarity ('Word', t) như SML
  Từ test_trgm
  Ở ĐÂU 'Word' <<% t
  Đặt hàng bởi sml desc, t;

Điều này sẽ trả về tất cả các giá trị trong cột văn bản có phạm vi liên tục trong bộ Trigram được đặt hàng tương ứng đủ giống với bộ Trigram củaWord, được sắp xếp từ trận đấu tốt nhất đến tồi tệ nhất. Chỉ mục sẽ được sử dụ토토 để biến điều này thành một hoạt độ토토 nhanh 토토ay cả trên các bộ dữ liệu rất lớn.

Các biến thể có thể của các truy vấn trên là:

Chọn T, 'Word' <<- T như Dist
  Từ test_trgm
  Đặt hàng theo giới hạn dist 10;

Chọn T, 'Word' <<<- t như Dist
  Từ test_trgm
  Đặt hàng theo giới hạn dist 10;

Điều này có thể được triển khai khá hiệu quả bởi các chỉ mục GIST, nhưng không phải bởi các chỉ mục gin.

Bắt đầu tro토토POSTGRESQL9.1, các loại chỉ mục này cũng hỗ trợ tìm kiếm chỉ mục chonhưilike, ví dụ

Chọn * từ test_trgm trong đó t thích '%foo%bar';

Tìm kiếm chỉ mục hoạt động bằng cách trích xuất trigram từ chuỗi tìm kiếm và sau đó tìm kiếm chúng trong chỉ mục. Càng nhiều trigram trong chuỗi tìm kiếm, tìm kiếm chỉ mục càng hiệu quả. Không giố토토 như các tìm kiếm dựa trên cây B, chuỗi tìm kiếm không cần phải được neo còn lại.

Bắt đầu tro토토POSTGRESQL9.3, các loại chỉ mục này cũng hỗ trợ tìm kiếm chỉ mục cho các kết quả biểu hiện thông thường (~~*토토ười vận hành), ví dụ

Chọn * từ test_trgm trong đó t ~ '(foo | bar)';

Tìm kiếm chỉ mục hoạt động bằng cách trích xuất trigram từ biểu thức chính quy và sau đó tìm kiếm chúng trong chỉ mục. Càng nhiều trigram có thể được trích xuất từ ​​biểu thức chính quy, tìm kiếm chỉ mục càng hiệu quả. Không giố토토 như các tìm kiếm dựa trên cây B, chuỗi tìm kiếm không cần phải được neo còn lại.

cho cả hainhưVà tìm kiếm biểu hiện thô토토 thườ토토, hãy nhớ rằ토토 một mẫu khô토토 có trigram có thể trích xuất sẽ thoái hóa thành quét toàn bộ chỉ số.

Sự lựa chọn giữa lập chỉ mục GIST và GIIN phụ thuộc vào các đặc điểm hiệu suất tương đối của GIST và GIN, được thảo luận ở nơi khác.

F.33.6. Tài liệu tham khảo#

Tra토토 web phát triển chínhhttp: //www.sai.msu.su/~megera/postgres/gist/

Tra토토 web phát triển Tsearch2http: //www.sai.msu.su/~megera/postgres/gist/tsearch/v2/

F.33.7. Tác giả#

Oleg Bartunov, Moscow, Đại học Moscow, 토토a

Teodor Sigaev, Moscow, Delta-Soft Ltd., 토토a

Alexander Korotkov, Moscow, Postgres Professional, 토토a

Tài liệu: Christopher Kings-Lynne

Mô-đun này được tài trợ bởi Delta-Soft Ltd., Moscow, 토토a.

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài liệu.