Kiểm thử và gỡ lỗi tìm kiếm văn bản

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 334 - 338)

Chương 12. Tìm kiếm toàn văn

12.8. Kiểm thử và gỡ lỗi tìm kiếm văn bản

Hành vi của một cấu hình tìm kiếm văn bản tùy biến có thể dễ dàng trở nên lúng túng. Các hàm được mô tả trong phần này là hữu dụng cho việc kiểm thử các đối tượng tìm kiếm văn bản. Bạn có thể kiểm thử một cấu hình hoàn chỉnh, hoặc tách bạch kiểm thử các trình phân tích và các từ điển.

12.8.1. Kiểm thử cấu hình

Hàm ts_debug cho phép kiểm thử dễ dàng một cấu hình tìm kiếm văn bản.

ts_debug([ config regconfig, ] document text, OUT alias text,

OUT description text, OUT token text,

OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[])

returns setof record

ts_debug hiển thị thông tin về từng thẻ token của document như được trình phân tích tạo ra và được các từ điển được cấu hình xử lý. Nó sử dụng cấu hình được config hoặc default_text_search_config chỉ định nếu đối số đó bị bỏ qua.

ts_debug trả về một hàng cho từng thẻ token được trình phân tích nhận diện trong văn bản. Các cột được trả về là

• alias text - tên ngắn gọn của dạng thẻ token

• description text - mô tả dạng thẻ token

• token text - văn bản của thẻ token

• dictionaries regdictionary[] - các thư mục được cấu hình chọn cho dạng thẻ token đó

• dictionary regdictionary - từ điển nhận biết được thẻ token đó, hoặc NULL nếu không nhận ra

• lexemes text[] - (các) từ vị được từ điển đó tạo ra mà nhận biết được thẻ token đó, hoặc NULL nếu không nhận ra; một mảng rỗng ({}) có nghĩa là nó từng được nhận biết như là một từ chết

Đây là một ví dụ đơn giản:

SELECT * FROM ts_debug(’english’,’a fat cat sat on a mat - it ate a fat rats’);

alias | description | token | dictionaries | dictionary | lexemes ---+---+---+---+---+--- asciiword | Word, all ASCII | a | {english_stem} | english_stem | {}

blank | Space symbols | | {} | | asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | cat | {english_stem} | english_stem | {cat}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | sat | {english_stem} | english_stem | {sat}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | on | {english_stem} | english_stem | {}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | a | {english_stem} | english_stem | {}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | mat | {english_stem} | english_stem | {mat}

blank | Space symbols | | {} | |

blank | Space symbols | - | {} | |

asciiword | Word, all ASCII | it | {english_stem} | english_stem | {}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | ate | {english_stem} | english_stem | {ate}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | a | {english_stem} | english_stem | {}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | fat | {english_stem} | english_stem | {fat}

blank | Space symbols | | {} | |

asciiword | Word, all ASCII | rats | {english_stem} | english_stem | {rat}

Để có sự trình diễn rộng mở hơn, chúng ta trước hết tạo một cấu hình public.english và từ điển Ispell cho ngôn ngữ tiếng Anh:

CREATE TEXT SEARCH CONFIGURATION public.english ( COPY = pg_catalog.english );

CREATE TEXT SEARCH DICTIONARY english_ispell ( TEMPLATE = ispell,

DictFile = english, AffFile = english, StopWords = english );

ALTER TEXT SEARCH CONFIGURATION public.english

ALTER MAPPING FOR asciiword WITH english_ispell, english_stem;

SELECT * FROM ts_debug(’public.english’,’The Brightest supernovaes’);

alias | description | token | dictionaries | dictionary

---+---+---+---+--- asciiword | Word, all ASCII | The | {english_ispell,english_stem} | english_ispell

blank | Space symbols | | {} |

asciiword | Word, all ASCII | Brightest | {english_ispell,english_stem} | english_ispell

blank | Space symbols | | {} |

asciiword | Word, all ASCII | supernovaes | {english_ispell,english_stem} | english_stem

Trong ví dụ này, từ Brightest đã được trình phân tích nhận ra như là một từ ASCII (tên hiệu

asciiword). Đối với dạng thẻ token này thì danh sách các từ điển là english_ispell và english_stem. Từ đó đã được english_ispell nhận ra, nó đã làm giảm từ đó xuống thành danh từ bright. Từ supernovaes

không được từ điển english_ispell nhận ra nên nó được truyền tới từ điển tiếp sau, và, may thay, đã được nhận ra (trong thực tế, english_stem là một từ điển bông tuyết mà nhận ra được mọi điều; điều đó giải thích vì sao nó đã được đặt ở cuối của danh sách các từ điển).

Từ The đã được từ điển english_ispell nhận ra như là một từ chết (Phần 12.6.1) và sẽ không được

đánh chỉ số. Các khoảng trống cũng được bỏ qua, vì cấu hình hoàn toàn không đưa ra các từ điển cho chúng.

Bạn có thể giảm độ rộng của đầu ra bằng việc chỉ định rõ ràng các cột nào bạn muốn thấy:

SELECT alias, token, dictionary, lexemes

FROM ts_debug(’public.english’,’The Brightest supernovaes’);

alias | token | dictionary | lexemes ---+---+---+--- asciiword | The | english_ispell | {}

blank | | |

asciiword | Brightest | english_ispell | {bright}

blank | | |

asciiword | supernovaes | english_stem | {supernova}

12.8.2. Kiểm thử trình phân tích

Các hàm sau cho phép kiểm thử trực tiếp một trình phân tích tìm kiếm toàn văn.

ts_parse(parser_name text, document text,

OUT tokid integer, OUT token text) returns setof record ts_parse(parser_oid oid, document text,

OUT tokid integer, OUT token text) returns setof record

ts_parse phân tích document được đưa ra và trả về một loạt các bản ghi, mỗi bản ghi cho từng thẻ token được phân tích đó tạo ra. Từng bản ghi bao gồm một mã tokid chỉ ra dạng thẻ token được chỉ định và một thẻ token là văn bản của thẻ token đó. Ví dụ:

SELECT * FROM ts_parse(’default’, ’123 - a number’);

tokid | token ---+--- 22 | 123 12 | 12 | - 1 | a 12 |

1 | number

ts_token_type(parser_name text, OUT tokid integer,

OUT alias text, OUT description text) returns setof record ts_token_type(parser_oid oid, OUT tokid integer,

OUT alias text, OUT description text) returns setof record

ts_token_type trả về một bảng mô tả từng dạng thẻ token mà trình phân tích được chỉ định có thể nhận ra. Đối với từng dạng thẻ token, bảng đó đưa ra tokid số nguyên mà trình phân tích đó sử dụng để gắn nhãn cho một thẻ token của dạng đó, alias mà đặt tên cho dạng thẻ token trong các lệnh cấu hình, và một description ngắn gọn. Ví dụ:

SELECT * FROM ts_token_type(’default’);

tokid | alias | description

---+---+--- 1 | asciiword | Word, all ASCII

2 | word | Word, all letters 3 | numword | Word, letters and digits 4 | email | Email address

5 | url | URL 6 | host | Host

7 | sfloat | Scientific notation

8 | version | Version number

9 | hword_numpart | Hyphenated word part, letters and digits 10 | hword_part | Hyphenated word part, all letters

11 | hword_asciipart | Hyphenated word part, all ASCII 12 | blank | Space symbols

13 | tag | XML tag 14 | protocol | Protocol head

15 | numhword | Hyphenated word, letters and digits 16 | asciihword | Hyphenated word, all ASCII

17 | hword | Hyphenated word, all letters 18 | url_path | URL path

19 | file | File or path name 20 | float | Decimal notation 21 | int | Signed integer 22 | uint | Unsigned integer 23 | entity | XML entity

12.8.3. Kiểm thử từ điển

Hàm ts_lexize tạo thuận lợi cho kiểm thử từ điển.

ts_lexize(dict regdictionary, token text) returns text[]

ts_lexize trả về một mảng các từ vị nếu đầu vào token được biết đối với từ điển đó, hoặc một mảng rỗng nếu thẻ token đó được biết đối với từ điển đó nhưng nó là một từ chết, hoặc NULL nếu nó là một từ không được biết. Ví dụ:

SELECT ts_lexize(’english_stem’, ’stars’);

ts_lexize --- {star}

SELECT ts_lexize(’english_stem’, ’a’);

ts_lexize --- {}

Lưu ý: Hàm ts_lexize kỳ vọng một thẻ token duy nhất, không phải văn bản text. Đây là một trường hợp nơi mà điều này có thể làm bối rối:

SELECT ts_lexize(’thesaurus_astro’,’supernovae stars’) is null;

?column?

--- t

Từ điển các từ đồng nghĩa thesaurus_astro nhận ra cụm từ supernovae stars, nhưng ts_lexize thì không vì nó không phân tích văn bản đầu vào mà ứng xử với nó như một thẻ token duy nhất. Hãy sử dụng

plainto_tsquery hoặc to_tsvector để kiểm thử các từ điển từ đồng nghĩa, ví dụ:

SELECT plainto_tsquery(’supernovae stars’);

plainto_tsquery ---

’sn’

Một phần của tài liệu Tài liệu quản trị postgresql (Trang 334 - 338)

Tải bản đầy đủ (PDF)

(372 trang)