Với sự hỗ trợ của các tài liệu XML lưu trữ tự nhiên, DB2® 9 của IBM® có một bước tiến hóa theo hướng hệ thống cơ sở dữ liệu lai. XQuery, một ngôn ngữ chính mới trong DB2, cho phép làm việc theo cách tối ưu với XML. Tuy nhiên, XML cũng thường chứa các phần văn bản lớn không dễ tìm kiếm được bằng XQuery. Để tìm kiếm có hiệu quả các phần tài liệu không có cấu trúc này, DB2 cung cấp một giải pháp tìm kiếm toàn văn bản. Bài viết này tập trung vào các vấn đề cơ bản về tìm kiếm văn bản của DB2, bao gồm cả việc tạo và quản trị chỉ mục văn bản. Bài viết này cùng tìm hiểu sâu về các tính năng cụ thể của việc tìm kiếm toàn văn bản của DB2, chẳng hạn như tìm kiếm các từ khóa hoặc các cụm từ trong cấu trúc tài liệu XML với tìm kiếm mờ, tìm kiếm gần đúng và tìm gốc của từ.

Holger Seubert, Kỹ sư phần mềm, IBM

Holger Seubert Seubert là một kỹ sư phần mềm IBM tập trung vào công nghệ XML trong DB2. Lúc làm việc trong phòng thí nghiệm phát triển của IBM tại Boeblingen, Đức, anh đã bắt đầu làm về các công nghệ ánh xạ của các tài liệu XML đến và từ hệ thống cơ sở dữ liệu phân cấp của IBM (IMS). Holger đang làm về thiết kế và triển khai thực hiện các giải pháp tìm kiếm toàn văn bản trong DB2 trên XML.



Sabine Perathoner-Tschaffler, Kỹ sư phần mềm, IBM

Sabine Perathoner-Tschaffler là một kỹ sư phần mềm tại Phòng thí nghiệm Boeblingen của IBM. Cô làm về lĩnh vực tìm kiếm toàn văn bản trong DB2 với việc tập trung hỗ trợ cho XML.



19 08 2011

XQuery, tiêu chuẩn W3C để truy cập dữ liệu XML, cung cấp nhiều biểu thức khác nhau để tìm vị trí và truy vấn các tài liệu XML. Hơn nữa bạn có thể sử dụng sức mạnh của ngôn ngữ này để tìm ra các tài liệu XML dựa vào tiêu chuẩn tìm kiếm toàn văn bản được không? Câu trả lời "vẫn chưa có". Hiện nay vẫn không có sự hỗ trợ nào cho các tính năng tìm kiếm toàn văn bản trong XQuery. Lý do của điều này nằm trong Mô hình dữ liệu XQuery (XQuery Data Model), dùng làm cơ sở cho mọi biểu thức XQuery. Để có thể tìm kiếm có hiệu quả dữ liệu toàn văn bản, cần có thông tin về các từ riêng lẻ tạo thành nội dung văn bản của dữ liệu đó và vị trí của chúng. Tuy nhiên, trong Mô hình dữ liệu XQuery, văn bản chỉ đơn giản là một "hộp đen". Mô hình dữ liệu không có khái niệm nào về các từ hoặc các thẻ ở bên trong một nút văn bản; nó chỉ biểu diễn nội dung văn bản của một phần tử hoặc thuộc tính như là một nút kề nhau.

Vì vậy, XQuery có thể không cung cấp thứ gì tốt hơn so với việc phối hợp chuỗi ký tự-con. Chức năng này được triển khai thực hiện với hàm contains() có sẵn, hàm này lấy một ngữ cảnh và một thời hạn tìm kiếm làm các tham số.

Do DB2 9 hỗ trợ XQuery như là ngôn ngữ chính, nên có thể thực hiện biểu thức XQuery sau đây trong một cửa sổ lệnh của DB2:

db2 => XQuery contains("The power of XML", "owe")

Như đã đề cập ở trên, hàm contains() triển khai thực hiện phối hợp chuỗi ký tự-con và do đó trả về giá trị true (đúng) cho truy vấn ở trên. Mặc dù người sử dụng tìm kiếm thuật ngữ "owe", kết quả lại là "power" và v.v.. cũng do hàm contains() trả về, hàm này có thể dẫn đến các kết quả tìm kiếm mà bạn thực sự không muốn tìm kiếm. Vẫn chưa có tiêu chuẩn nào bao gồm chức năng tìm kiếm văn bản trong ngôn ngữ XQuery. Rõ ràng, đây là một nhiệm vụ của Phiên bản 1 của XQuery sau, đã bắt đầu trong một nhóm làm việc riêng biệt: toàn văn bản XQuery 1.0 và XPath 2.0.

Trong khi chờ đợi tiêu chuẩn mới này, hiện nay bạn có thể làm gì để tìm ra các tài liệu XML có liên quan dựa vào các từ khoá và cụm từ? Phần dưới đây đưa ra một tổng quan ngắn gọn về chức năng tìm kiếm toàn văn bản của DB2, giúp cho có khả năng tìm kiếm văn bản nhận biết-cấu trúc trên XML.

Trình mở rộng tìm kiếm Net của DB2 rút gọn lại

Khi nói đến các tài liệu XML tìm kiếm văn bản, hãy xem xét cả hai cấu trúc nội dung và cấu trúc tài liệu thực tế. Một kịch bản điển hình là giới hạn việc tìm kiếm văn bản theo một phần tử cụ thể hoặc cây con của cấu trúc toàn bộ tài liệu XML, giống như:

"Hãy tìm tất cả các tài liệu có từ 'XML' và 'database' trong phần tử abstract (trừu tượng), cụm từ 'text search' (tìm kiếm văn bản) và 'Viper Release' ' (Phiên bản Viper) trong phần tử title (tiêu đề) và cả hai từ phải ở trong cùng một câu."

Việc tìm kiếm toàn văn bản nhận biết-cấu trúc như vậy trên tài liệu XML trong DB2 được triển khai thực hiện với Trình mở rộng tìm kiếm Net (Net Search Extender - NSE) của DB2, một tính năng được cài đặt riêng rẽ đi kèm với DB2.

Việc tìm kiếm văn bản được tích hợp trong SQL và được tối ưu hóa bằng trình tối ưu hóa của DB2 trong thời gian chạy. Các nhiệm vụ quản trị, chẳng hạn như việc tạo và bảo trì chỉ mục, có thể được thực hiện bằng cách sử dụng Trung tâm Kiểm soát DB2.

Khi sử dụng SQL, Net Search Extender tìm kiếm dữ liệu văn bản đã được lưu giữ trong cột của một bảng cơ sở dữ liệu. Thay vì tìm kiếm liên tục thông qua dữ liệu văn bản bằng cách sử dụng phối hợp chuỗi ký tự, như đã thực hiện bằng hàm XQuery contains(), Net Search Extender sử dụng một chỉ mục văn bản. Việc sử dụng một chỉ mục văn bản làm cho việc tìm kiếm tài liệu hiệu quả hơn nhiều, do không cần kiểm tra dữ liệu văn bản lúc truy vấn giống như khi thực hiện nó bằng phối hợp chuỗi ký tự-con. Một chỉ mục văn bản thường bao gồm thông tin về các số hạng liên quan được trích xuất từ các tài liệu văn bản. Trong các trường hợp XML, không chỉ các số hạng quan trọng, mà còn cả vị trí của chúng trong cấu trúc tài liệu XML được duy trì trong chỉ mục văn bản.

Bây giờ bạn đã quen thuộc với các nguyên tắc cơ bản của Net Search Extender, bạn đã sẵn sàng để tìm hiểu cách sử dụng nó để thực hiện các tìm kiếm toàn văn bản trên dữ liệu XML. Hãy tìm hiểu cách tạo ra một chỉ mục văn bản trong phần tiếp theo.

Chuẩn bị để tìm kiếm văn bản

Các nhiệm vụ cần được thực hiện để tìm kiếm trong các tài liệu XML trong DB2 có thể được chia thành hai phần:

  1. Các nhiệm vụ quản lý chỉ mục.
  2. Tìm kiếm toàn văn bản.

Phần này đi nhanh qua cả hai kiểu nhiệm vụ bằng cách sử dụng các ví dụ xem xét bảng "product" (sản phẩm) như được định nghĩa trong Liệt kê 1. Lưu ý rằng cột "description" (mô tả) và "comments" (các nhận xét) của bảng "product" là kiểu XML (nói cách khác, các tài liệu XML "description" và "comments" được lưu trữ tự nhiên trong cơ sở dữ liệu).

Liệt kê 1. Định nghĩa bảng
create table product (
    pid varchar(10) primary key not null,
    description xml,
    comments xml
    );

Dữ liệu XML ví dụ được lưu trữ trong các cột "product.description" và "product.comment" được thể hiện tương ứng trong Hình 1Hình 2 Các ví dụ truy vấn tiếp theo tìm kiếm các phần tử cụ thể của các tài liệu XML này. Cách chèn các tài liệu XML vào DB2 được trình bày trong bài "Hãy khởi đầu nhanh chóng với DB2 Viper" (developerWorks, 03.2006).

Hình 1. Dữ liệu ví dụ của cột "product.description"
Dữ liệu XML ví dụ của sản phẩm
Hình 2. Dữ liệu ví dụ của cột "product.comments"
Dữ liệu XML ví dụ của Comments

Trước tiên hãy xem xét những gì cần làm để thực hiện các hoạt động tìm kiếm văn bản trên bảng "product", giống như tìm kiếm tên của một sản phẩm có từ "satisfactory" (vừa ý) trong phần tử "message" (thông báo) của các nhận xét của nó hoặc một sản phẩm có cụm từ "sugar and creamer" (đường và kem) trong phần tử "details" (các chi tiết) của mô tả của nó.

Trước khi bạn có thể sử dụng Net Search Extender, bạn phải khởi động các dịch vụ cá thể của nó, như trong Liệt kê 2.

Liệt kê 2. Lệnh để khởi động các dịch vụ cá thể của Net Search Extender
db2text start

Lưu ý rằng lệnh này gọi một lệnh thực hiện riêng có tên là db2text. Như bạn thấy, bất kỳ nhiệm vụ quản trị chỉ mục văn bản nào cũng cần được thực hiện bằng lệnh db2text.

Sau khi khởi động, Net Search Extender cho phép các cơ sở dữ liệu DB2 thực hiện các hoạt động tìm kiếm văn bản. Bước này tạo ra các bảng quản trị cần thiết và Các hàm do người dùng định nghĩa khác nhau (UDF) và Các thủ tục đã lưu trữ (STP) cần dùng để tìm kiếm toàn văn bản trên dữ liệu DB2 và được thực hiện chỉ một lần cho mỗi cơ sở dữ liệu.

Lệnh cho phép "thử nghiệm" một cơ sở dữ liệu cho các hoạt động tìm kiếm văn bản trông như sau:

Liệt kê 3. Lệnh này cho phép "thử nghiệm" cơ sở dữ liệu cho các hoạt động tìm kiếm văn bản
db2text enable database for text connect to test

Trong trường hợp bạn không thiết lập biến môi trường DB2DBDFT, tất cả các nhiệm vụ quản trị của Net Search Extender đều yêu cầu mệnh đề connect to <dbname>, ở đây <dbname> là tên của cơ sở dữ liệu của bạn. Các lệnh sau đây giả định rằng DB2DBDFT đã được thiết lập.

Sau khi cho phép một cơ sở dữ liệu dùng cho văn bản, bạn có thể tạo các chỉ mục văn bản trên các cột đang lưu trữ dữ liệu văn bản theo các định dạng khác nhau, như XML. Lệnh create index thiết lập cơ sở hạ tầng chỉ mục văn bản bằng cách định nghĩa các thuộc tính chỉ mục văn bản, chẳng hạn như tần số cập nhật, định dạng tài liệu, thư mục chỉ mục và v.v.. Để biết thêm thông tin về các thuộc tính chỉ mục khác nhau, hãy tham khảo tài liệu Net Extender Search. Ví dụ được dùng trong bài viết này sử dụng việc tạo chỉ mục văn bản cơ bản, như trong Liệt kê 4:

Liệt kê 4. Việc tạo một chỉ mục văn bản ix1 trên cột "product.description"
db2text create index ix1 for text on product(description)

Lệnh trong Liệt kê 4 tạo ra một chỉ mục toàn văn bản có tên là "ix1" dựa vào các tài liệu XML được lưu trữ tự nhiên trong cột "description" của bảng "product".

Lưu ý rằng sau khi bạn tạo một chỉ mục văn bản, việc tìm kiếm văn bản không tìm thấy bất kỳ kết quả nào, do chỉ mục văn bản không chứa dữ liệu ở điểm này. Dữ liệu của bạn và chỉ mục văn bản cần phải được đồng bộ một cách rõ ràng nếu không có tần số cập nhật nào được quy định. Nhiệm vụ đồng bộ hóa chỉ mục văn bản được gọi là cập nhật chỉ mục và thường làm ngay sau khi bạn đã tạo ra một chỉ mục văn bản.

Liệt kê 5. Đồng bộ hóa chỉ mục văn bản với dữ liệu trong bảng cơ sở
db2text update index ix1 for text

Quá trình cập nhật chỉ mục có thể hoặc được thực hiện bằng thủ công khi sử dụng lệnh trong Liệt kê 5 hoặc được thực hiện tự động theo lịch biểu khi sử dụng một trình tiện ích tầng sau của nền tảng. Có thể quy định cập nhật chỉ mục tự động như một thuộc tính chỉ mục trong quá trình tạo chỉ mục hoặc được quy định sau khi sử dụng một lệnh chỉ mục thay thế.

Các bước cần được hoàn thành để chuẩn bị cho các hoạt động tìm kiếm toàn văn bản trong DB2 được tóm tắt dưới đây:

Bảng 1. Các bước để chuẩn bị tìm kiếm toàn văn bản trong DB2
Các bướcMô tả Ví dụ
Bước 1Khởi động các dịch vụ cá thể của Net Search Extender.db2text start
Bước 2Cho phép cơ sở dữ liệu của bạn dùng để tìm kiếm toàn văn bản.db2text enable database for text
Bước 3Tạo một chỉ mục toàn văn bản.db2text create index ixName for text on table(column)
Bước 4Cập nhật chỉ mục toàn văn bản được tạo ra trước.db2text update index ixName for text

Sau khi hoàn thành bốn bước quản trị, bạn đã sẵn sàng đi tiếp và tìm kiếm toàn văn bản dữ liệu XML. Vậy, các tính năng tìm kiếm thật sự có thể được sử dụng để tìm thông tin liên quan là gì?


Tìm thấy những gì bạn đang tìm kiếm

Cách phổ biến nhất để thực hiện tìm kiếm toàn văn bản với Net Search Extender là sử dụng hàm tìm kiếm vô hướng SQL CONTAINS() của nó. Sử dụng hàm này ở nơi sử dụng SQL chuẩn và ở nơi bạn có thể dễ dàng kết hợp nó với các điều kiện khác trong một mệnh đề SQL WHERE. Ngoài ra, việc tích hợp chặt chẽ vào trình tối ưu hóa DB2 tạo ra hiệu năng thời gian chạy cao. (Hai phương thức tìm kiếm khác cũng có sẵn cho các tình huống chuyên nghiệp hơn, nhưng bài viết này không thảo luận về chúng). Ví dụ sau đây cho thấy cách sử dụng hàm vô hướng CONTAINS() để ban hành tìm kiếm toàn văn bản:

Liệt kê 6. Hàm vô hướng CONTAINS
SELECT column
FROM table
WHERE CONTAINS(column-name, 'search-criteria')=1;

Hàm CONTAINS() có hai tham số: tên cột, thiết lập ngữ cảnh trong đó tìm kiếm toàn văn bản sẽ xảy ra và tiêu chuẩn tìm kiếm thực tế sẽ được áp dụng.

Các tiêu chuẩn tìm kiếm cơ bản của Net Search Extender có các tính năng sau đây:

  • Các phép toán Boolean để kết nối (AND), phân tách (OR) và loại trừ (NOT) của các từ tìm kiếm.
  • Các từ tìm kiếm riêng có thể là các từ đơn hay cụm từ, ví dụ như "New" "York" hoặc "New York".
  • Tìm kiếm gần đúng (Proximity) dùng cho các từ trong cùng một câu hoặc cùng một đoạn.
  • Tìm kiếm mờ (Fuzzy) dùng cho các từ có một cách viết chính tả tương tự như từ tìm kiếm.
  • Tìm kiếm Ký tự đại diện (Wildcard), sử dụng che dấu phần trước, phần giữa và phần cuối.

Net Search Extender cung cấp các tính năng tìm kiếm nâng cao hơn là:

  • Hỗ trợ từ đồng nghĩa dùng cho các truy vấn rộng hơn, bằng cách tìm kiếm không chỉ với một từ tìm kiếm cụ thể, mà còn với các từ có liên quan đến nó theo các quan hệ do người dùng định nghĩa.
  • Tìm kiếm các dãy số, có thể hoặc trong các tài liệu có cấu trúc hoặc trong các cột bổ sung.
  • Tìm gốc từ để rút gọn từ tìm kiếm đến từ gốc của nó trước khi thực hiện tìm kiếm (chỉ cho tiếng Anh).

Để thực hiện tìm kiếm đích bên trong cấu trúc tài liệu của các tài liệu XML, Net Search Extender cung cấp tìm kiếm dựa theo phần bằng cách:

  • giới hạn tìm kiếm theo các phần tử XML.
  • giới hạn tìm kiếm theo các thuộc tính XML.
  • hỗ trợ kiểu nội dung hỗn hợp của các phần tử XML.

Bây giờ bạn đã thấy Net Search Extender cung cấp những ý tưởng cơ bản của các tính năng tìm kiếm, chúng ta hãy tìm hiểu cách sử dụng thực tế của chúng bằng ví dụ.

Tìm kiếm văn bản bằng cách sử dụng SQL và XQuery

Các truy vấn sau đây truy cập vào bảng "product" đã được giới thiệu trong Liệt kê 1. Dữ liệu XML ví dụ đã lưu trữ trong cột "product.description" được thể hiện trong Hình 1. Các ví dụ truy vấn tiếp theo tìm kiếm các phần tử cụ thể của cột XML này.

Hãy xem xét văn bản đơn giản sau đây tìm kiếm bảng "product" để trả về tất cả các trình định danh sản phẩm (dữ liệu "pid") có từ "creamer" (kem) ở một nơi nào đó trong cấu trúc tài liệu về thông tin sản phẩm (trong cột "product.description"):

Liệt kê 7. Cú pháp cơ bản để tìm kiếm văn bản
SELECT pid
FROM product
WHERE CONTAINS(description,' "creamer" ')=1;

Sử dụng hàm SQL/XML XMLQUERY(), các phần tử XML riêng biệt về thông tin sản phẩm có thể được chiếu vào trong kết quả. Truy vấn sau trả về phần tử "name" (tên) của sản phẩm có từ "creamer" ở một nơi nào đó trong cấu trúc tài liệu:

Liệt kê 8. Sử dụng chức năng tìm kiếm văn bản kết hợp với XMLQUERY()
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description, ' "creamer" ')=1;

Truy vấn tìm kiếm toàn văn bản SQL tương tự, như trong Liệt kê 8 ở trên, có thể được thể hiện bằng XQuery như sau:

Liệt kê 9. Tìm kiếm văn bản trong ngữ cảnh XQuery
XQUERY for $prod in db2-fn:sqlquery("SELECT description
  FROM product
  WHERE CONTAINS (description, ' "creamer" ')=1")
return $prod//name

Biểu thức tìm kiếm toàn văn bản được thể hiện trong một ngữ cảnh SQL và các tài liệu XML có liên quan được xử lý trong ngữ cảnh XQuery khi sử dụng hàm đầu vào db2-fn:sqlquery().

Trong các ví dụ ở trên, việc tìm kiếm văn bản được thực hiện trên toàn bộ cấu trúc tài liệu XML (nói cách khác, trong tất cả các nút văn bản và các giá trị thuộc tính không để ý đến nơi thỏa mãn tiêu chuẩn tìm kiếm trong tài liệu). Cái gì giới hạn việc tìm kiếm văn bản theo các phần tử XML hay các thuộc tính XML cụ thể?

Giới hạn tìm kiếm văn bản theo các phần tử hay các thuộc tính XML

Việc giới hạn tìm kiếm văn bản theo các phần cụ thể trong cấu trúc tài liệu là một trong những tính năng được sử dụng thường xuyên nhất để tìm kiếm toàn văn bản XML. Trong Net Search Extender của DB2, việc giới hạn tìm kiếm văn bản theo các phần tử cụ thể hoặc các cây con của các tài liệu XML được thể hiện bằng một XPath có đủ điều kiện hoàn toàn. XPath này xác định một phần của cấu trúc tài liệu XML muốn tìm kiếm.

Net Search Extender hỗ trợ cú pháp bước-vị trí XPath đã rút gọn và cho phép sử dụng trục con (/) và trục thuộc tính (@). Không hỗ trợ các biểu thức hoặc hàm XPath khác.

Ví dụ, có thể giới hạn việc tìm kiếm văn bản với các từ "creamer" và "pattern" (mẫu) theo phần tử "name" của tài liệu XML sản phẩm trong cột "product.description" cho truy vấn sau đây:

Liệt kê 10. Giới hạn việc tìm kiếm các phần tử hoặc các thuộc tính XML với mệnh đề SECTION
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,'
             SECTION("/product/description/name") ("creamer","pattern") ')=1;

Mệnh đề SECTION như là một phần trong tiêu chuẩn tìm kiếm văn bản xác định phần đó trong cấu trúc tài liệu XML, ở nơi sẽ xảy ra tìm kiếm văn bản. Với các bước vị trí, như được định nghĩa trong tiêu chuẩn XPath, phần tử "name" XML bên trong cấu trúc XML sản phẩm được xác định trong ví dụ trên. Câu lệnh SELECT trả về tất cả các phần tử name của các sản phẩm có từ "creamer" và từ "pattern" theo trình tự bất kỳ trong phần tử "name" tương ứng.

Với XQuery làm ngôn ngữ chính, truy vấn tương tự trông như sau:

Liệt kê 11. XQuery làm ngôn ngữ chính
XQUERY for $prod in db2-fn:sqlquery("SELECT description
     FROM product
     WHERE CONTAINS(description,
                    ' SECTION("/product/description/name") ("creamer","pattern" ')=1)
  return $prod//name

Ngoài ra, cũng có thể giới hạn tìm kiếm văn bản theo các thuộc tính XML cụ thể, bằng cách sử dụng trục thuộc tính, như trong ví dụ sau đây:

Liệt kê 12. Giới hạn tìm kiếm văn bản theo các thuộc tính XML
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,'
                SECTION("/product/description/category/@catx")"sterling" ')=1;

Mệnh đề SECTION quy định giới hạn tìm kiếm văn bản theo thuộc tính XML "catx" bằng cách sử dụng XPath tương ứng. Phần tử "name" của tất cả các sản phẩm có từ "sterling" (bảng Anh) dùng làm giá trị của thuộc tính XML "catx" được trả về.

Liệt kê 12 cho thấy có thể thực hiện tìm kiếm các từ khác nhau trong cùng phần này như thế nào. Cũng có thể kết hợp tìm kiếm trong các phần khác. Khi sử dụng toán tử AND (&) của Boolean, truy vấn sau đây trong Liệt kê 13 trả về tất cả các phần tử "name" của những sản phẩm nào có từ "sterling" trong thuộc tính "catx" của phần tử "category" và từ "creamer" trong phần tử "name":

Liệt kê 13. Tìm kiếm trong các phần khác nhau
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(description,' SECTION("/product/description/category/@catx")"sterling"
                    & SECTION("/product/description/name")"creamer" ')=1;

Việc tìm kiếm qua các ranh giới phần tử

Đôi khi bạn bắt gặp các phần tử XML có một kiểu nội dung hỗn hợp chứa dữ liệu văn bản và các phần tử XML khác. Ví dụ, phần tử XML "sentence" sau đây chứa một số phần tử văn bản và phần tử "entity" (thực thể) khác:

Hình 3. Phần tử XML của một kiểu nội dung hỗn hợp
Ví dụ về kiểu nội dung hỗn hợp

Trong trường hợp này, bạn muốn tìm kiếm qua các ranh giới phần tử (nói cách khác, việc tìm kiếm cụm từ "IBM Software Group" (Tập đoàn phần mềm IBM) trong phần tử "sentence" sẽ tìm ra các kết quả, mặc dù các phần của từ tìm kiếm này xuất hiện trong các phần tử khác nhau). Net Search Extender có khả năng xử lý nội dung hỗn hợp -- tìm kiếm qua các ranh giới phần tử.

Hãy xem xét đoạn XML ở trên được lưu trữ trong một cột "description" trong bảng "product", truy vấn sau trả về một kết quả:

Liệt kê 14. Các kết quả truy vấn
SELECT description
FROM product
WHERE CONTAINS(description,'
               SECTION("/sentence") "IBM Software Group" ')=1;

Mặc dù thẻ "IBM" là Text Node (nút văn bản) trực hệ của phần tử "entity" (thực thể) và phạm vi để tìm kiếm văn bản là phần tử XML "sentence", truy vấn trả về một yêu cầu nhấn chuột.

Cho đến nay, sức mạnh của các chỉ mục toàn văn bản hoàn toàn chưa được khai thác. Đã thấy các ví dụ về cách giới hạn tìm kiếm theo các phần cụ thể trong cấu trúc tài liệu, Net Search Extender cung cấp nhiều cách thể hiện tiêu chuẩn tìm kiếm.

Khai thác sức mạnh về tìm kiếm văn bản

Ngoài ra để giới hạn tìm kiếm văn bản theo các phần tử hoặc các thuộc tính cụ thể, Net Search Extender cung cấp một số tính năng khác để định nghĩa tiêu chuẩn tìm kiếm văn bản. Ví dụ, bạn có thể giới hạn việc tìm kiếm văn bản theo các từ trùng khớp chỉ khi chúng xảy ra trong cùng một câu (tìm kiếm gần đúng).

Những phần sau đây sẽ cung cấp các ví dụ về các tính năng tìm kiếm khác nhau đã được giới thiệu từ trước.

Truy vấn trong Liệt kê 15 tìm ra tất cả các trình định danh sản phẩm của những sản phẩm nào có từ "pattern" (mẫu) và "sugar và creamer" (đường và kem) không chỉ trong phần tử "details" (các chi tiết) của tài liệu XML, mà còn trong cùng một câu:

Liệt kê 15. Tìm kiếm gần đúng
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description/details") "pattern"
               IN SAME SENTENCE AS "sugar and creamer"')=1;

Hai bắt buộc về cấu trúc được kết hợp trong ví dụ này: việc tìm kiếm bị giới hạn trong một phần tử cụ thể ("details") và trong nội dung văn bản của phần tử đó (nút văn bản của nó), việc tìm kiếm cũng bị giới hạn theo các từ xuất hiện trong cùng một câu. Lưu ý rằng một từ tìm kiếm "sugar and creamer" bao gồm một cụm từ trong đó các từ đơn "sugar", "and" và "creamer" được tìm kiếm theo trình tự chính xác này. Mặt khác, việc tìm kiếm các thẻ "creamer", "and" và "sugar" theo trình tự bất kỳ trong ngữ cảnh tương tự có thể được thể hiện như sau:

Liệt kê 16. Sự khác biệt giữa tìm kiếm cụm từ và tìm kiếm các thẻ
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description/details") "pattern"
                IN SAME SENTENCE AS ("creamer","and","sugar")')=1;

Các toán tử Boolean

Các từ tìm kiếm khác nhau có thể được kết hợp với các từ tìm kiếm khác bằng cách sử dụng các toán tử Boolean "&" (AND), "|" (OR) và NOT. Ví dụ sau đây kết hợp một số từ bằng cách sử dụng các toán tử Boolean là AND và OR:

Liệt kê 17. Sử dụng các toán tử Boolean là AND và OR
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description") 
                         "pattern" & "creamer" | "sugar" ')=1;

Truy vấn này trả về tất cả các "pid" của những sản phẩm có từ "pattern" và "creamer" hoặc "sugar" trong phần tử mô tả.

Toán tử Boolean NOT có thể được sử dụng để loại trừ các từ cụ thể khỏi các kết quả tìm kiếm. Ví dụ, câu truy vấn sau đây trong Liệt kê 18 tìm kiếm các tài liệu có từ "pattern" và "creamer" và không có "sugar" trong phần tử "description":

Liệt kê 18. Toán tử Boolean NOT
SELECT pid
FROM product
WHERE CONTAINS(description,
         'SECTION("/product/description") "pattern" & "creamer" & NOT "sugar" ')=1;

Tìm kiếm mờ

Một tính năng phổ biến khác là tìm kiếm mờ (fuzzy). Tìm kiếm mờ tìm ra các tài liệu chứa từ tìm kiếm được viết theo cách tương tự đúng chính tả với từ tìm kiếm được đưa ra. Theo cách ấy, ba ký tự đầu tiên cần ăn khớp. Nó thường được dùng khi có viết sai chính tả trong tài liệu.

Liệt kê 19. Tìm kiếm mờ để tìm các từ được viết tương tự theo đúng chính tả
SELECT pid
FROM product
WHERE CONTAINS(description,
      'SECTION("/product/description") FUZZY FORM OF 80 "patern" & "creamer"')=1;

Chú ý rằng từ "patern" là sai chính tả, nhưng với một tìm kiếm mờ, có thể tìm ra các tài liệu có chứa từ "pattern" được viết đúng chính tả. Mức độ khớp, trong ví dụ này là 80, xác định độ chính xác. Độ chính xác có thể khác nhau từ 1 đến 100, trong đó 100 là khớp chính xác.

Tìm phần gốc của từ

Việc tìm kiếm dạng gốc của một từ làm cho từ đó được rút gọn tới từ gốc của nó trước khi tìm kiếm. Ví dụ sau đây tìm kiếm dạng mờ của từ "patern" hoặc dạng gốc của từ "creamy". Việc tìm kiếm phần gốc của từ trả về các tài liệu có các từ như "creamer", "creamed" hay "cream" trong nội dung văn bản của chúng.

Liệt kê 20. Tìm kiếm phần gốc từ cho từ "creamy"
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description")
           FUZZY FORM OF 42 "patern" | STEMMED FORM OF "creamy"')=1;

Ký tự đại diện (Wildcard)

Net Search Extender hỗ trợ hai loại che dấu ký tự để tìm kiếm ký tự đại diện:

  • che dấu bất kỳ ký tự đơn (_) nào.
  • che dấu bất kỳ số các ký tự tùy ý (%) nào.

Một truy vấn ví dụ khi sử dụng tìm kiếm ký tự đại diện được hiển thị trong Liệt kê 21.

Liệt kê 21. Tìm kiếm theo các ký tự đại diện
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description") "pat_ern" & "cream%" ')=1;

Ví dụ, truy vấn này sẽ phối hợp các tài liệu có chứa các từ "pattern" và "creamer" trong phần tử "description".

Một điều bạn luôn cần xem xét ...

Có lẽ bạn đang muốn biết tại sao cho đến nay chúng ta đã không tìm kiếm trong cột "comments" của bảng "product". Lý do là để đặt trọng tâm vào một khía cạnh tìm kiếm quan trọng trong các tài liệu XML: Luôn trả về toàn bộ tài liệu XML như là một kết quả tìm kiếm, chứ không phải là một phần tài liệu hoặc phần tử cụ thể ở nơi nhấn chuột.

Khía cạnh này được giải quyết trên cơ sở của tài liệu XML "comments" được hiển thị trong Hình 2. Được so sánh với các tài liệu "product", các tài liệu này có đặc điểm cấu trúc khác nhau. Trong một phần tử "comments", có rất nhiều phần tử "comment" lặp lại.

Ví dụ, việc tìm kiếm tên của một sản phẩm có dạng gốc của từ "disappointing" (thất vọng) trong phần tử "message" (thông báo) của nhận xét của nó có thể được thể hiện như sau:

Liệt kê 22. Tìm kiếm tên sản phẩm với dạng gốc của từ "disappointing" trong phần tử "message" của nhận xét của nó
SELECT XMLQUERY('$prod//name' passing description as "prod")
FROM product
WHERE CONTAINS(comments, 'SECTION("/comments/comment/message")
                          STEMMED FORM OF "disappointing"')=1

Truy vấn này trả về tên của sản phẩm theo cách sau đây:

tiêu đề
<name>Sterling Sugar & Creamer by Gorham</name>
   1 record(s) selected.

Việc tìm kiếm các tài liệu XML có các phần tài liệu lặp lại có thể thực hiện mà không cần bất kỳ lý do thêm nào, miễn là bạn không trực tiếp truy cập vào các phần lặp lại đó, giống như những các phần tử "comment" trên cột "comments" trong ví dụ của chúng ta.

Tuy nhiên, nếu bạn muốn lấy phần tử "customerID" (ID khách hàng) của khách hàng đã đưa ra một nhận xét có từ "disappointment" trong phần tử thông báo, thì một cách tiếp cận đầu tiên để tìm ra thông tin này có thể trông như sau:

Liệt kê 23. Lấy phần tử "customerID" của khách hàng đã đưa ra một nhận xét có từ "disappointment" trong phần tử message
XQuery for $co in db2-fn:sqlquery("SELECT comments
                    FROM product
                    WHERE CONTAINS(comments,
                         'SECTION("/comments/comment/message")
                          STEMMED FORM OF "disappointed"')=1")
       return $co//customerID

Trình tự được trả về của các phần tử XML là:

Liệt kê 24. Trình tự được trả về của các phần tử XML
<customerID>1187594</customerID>
<customerID>238461</customerID>

  2 record(s) selected

Như bạn thấy, còn có phần tử "customerID" của khách hàng đã không đưa ra nhận xét, chứa các dạng gốc của từ "disappointed", được trả về.

Cũng vậy, có thể thể hiện một truy vấn tương tự trong một ngữ cảnh SQL như sau:

Liệt kê 25. Một truy vấn tương tự được thể hiện trong một ngữ cảnh SQL
SELECT XMLQUERY('$co//customerID' passing comments as "co")
FROM product
WHERE CONTAINS(comments, 'SECTION("/comments/comment/message")
                          STEMMED FORM OF "dissapointed"')=1

Trình tự được trả về trông giống như:

tiêu đề
<customerID>1187594</customerID><customerID>238461</customerID>

  1 record(s) selected.

Một lần nữa, cả hai phần tử "customerID" được truy vấn tìm kiếm trả về, do việc tìm kiếm thường trả về toàn bộ tài liệu XML. Khía cạnh này rất quan trọng cần nên được xem xét khi làm việc với các kết quả tìm kiếm XML. Tuy nhiên, bạn có thể làm gì để lấy ra chỉ một phần tử "customerID" mà bạn đang tìm kiếm?

Trong các trường hợp ở nơi không sử dụng chức năng tìm kiếm nâng cao, giống như tìm phần gốc của từ, thì có thể sử dụng một cách khác bằng cách sử dụng hàm XQuery contains() có sẵn đã được giới thiệu ở trên.

Truy vấn sau đây sử dụng thông tin tìm kiếm toàn văn bản để lọc những tài liệu nào có từ "disappointing" trong phần tử XML "message". Việc tìm kiếm những tài liệu đó trả về toàn bộ các tài liệu "comments" đang thỏa mãn điều kiện tìm kiếm này. Trái ngược với các truy vấn trước đó, truy vấn sau đây thêm một biến vị ngữ vào phần tử thông báo bằng cách sử dụng hàm XQuery contains(). Do vậy, các tài liệu nào thỏa mãn tiêu chuẩn tìm kiếm toàn văn bản được lọc thêm dựa vào biến vị ngữ của XPath.

Liệt kê 26. Tiêu chuẩn tìm kiếm toàn văn bản được lọc thêm dựa vào biến vị ngữ của XPath
SELECT XMLQUERY('$co/comments/comment[contains(message,"disappointing")]
                    /customerID' passing comments as "co")
FROM product
WHERE CONTAINS(comments, 'SECTION("/comments/comment/message")
                          "disappointing"')=1;

Truy vấn tương tự như trên có thể cũng được thể hiện trong một ngữ cảnh XQuery:

Liệt kê 27. Truy vấn tương tự được thể hiện trong một ngữ cảnh XQuery
XQuery for $co in db2-fn:sqlquery('SELECT comments FROM product
         WHERE CONTAINS(comments,
        ''SECTION("/comments/comment/message") "disappointing" '')=1')
       return $co/comments/comment[contains(message,"disappointing")]/customerID

Cả hai truy vấn trả về phần tử "customerID" đã dự kiến của khách hàng đã đưa ra nhận xét cụ thể.

<customerID>238461</customerID>

  1 record(s) selected

Xem xét vùng tên của XML

Trong trường hợp ở đó dữ liệu XML thuộc về một vùng tên không theo mặc định cụ thể, tên đủ điều kiện đầy đủ (tiền tố vùng tên + tên phần tử) phải được sử dụng khi tìm kiếm trong các phần tử hoặc các cây con cụ thể trong cấu trúc tài liệu.

Giả sử các phần tử của dữ liệu sản phẩm XML thuộc về một vùng tên có tiền tố "ns" như sau:

Hình 4. Dữ liệu sản phẩm XML với vùng tên
Dữ liệu sản phẩm XML với vùng tên

Đề cập đến một ví dụ tìm kiếm trước đó, Net Search Extender không tìm thấy bất kỳ kết quả nào trong trường hợp này:

Liệt kê 28. Net Search Extender không tìm thấy kết quả nào
SELECT pid
FROM product
WHERE CONTAINS(description,
           'SECTION("/product/description/details") "pattern"')=1;

Nói cách khác, biểu thức XPath được dùng để định nghĩa một phần XML cần tìm kiếm không chứa tiền tố vùng tên -- tên phần tử đủ điều kiện đầy đủ (QName).

Bạn phải sử dụng các tên phần tử XML đủ điều kiện đầy đủ này trong tham số SECTION để tìm tài liệu ví dụ của chúng ta:

Liệt kê 29. Sử dụng các tên phần tử XML đủ điều kiện đầy đủ trong tham số SECTION
SELECT pid
FROM product
WHERE CONTAINS(description,
           'SECTION("/ns:product/ns:description/ns:details")
           "pattern"  IN SAME SENTENCE AS "sugar and creamer"')=1;

Net Search Extender phối hợp các tên phần tử/thuộc tính khi chúng xuất hiện trong tài liệu, bao gồm bất kỳ tiền tố vùng tên nào. Tuy nhiên, nếu bạn đang sử dụng một vùng tên mặc định, bạn không phải thêm tiền tố cho các phần tử này!

Một phương thức để cấu hình cách xử lý các phần riêng lẻ trong một cấu trúc tài liệu XML được thực hiện theo một mô hình tài liệu Net Search Extender. Cách sử dụng của nó được giải thích trong phần sau.

Làm rõ mô hình tài liệu NSE

Bạn có thể sử dụng một mô hình tài liệu Net Search Extender để cấu hình phạm vi tìm kiếm trong các tài liệu có cấu trúc, chẳng hạn như XML. Một mô hình tài liệu trước tiên kiểm soát những phần nào của một cấu trúc tài liệu cần được lập chỉ mục, các phần này được lập chỉ mục như thế nào và bạn có thể tham chiếu các phần tài liệu này theo tên nào trong quá trình tìm kiếm.

Có hai kiểu mô hình tài liệu:

  • Tài liệu mặc định.
  • Một mô hình tài liệu tùy chỉnh do người dùng định nghĩa.

Để sử dụng một mô hình tài liệu tùy chỉnh, bạn phải chỉ định một mô hình lúc tạo chỉ mục văn bản. Nếu không có mô hình tài liệu tùy chỉnh nào được cung cấp làm tham số chỉ mục, Net Search Extender sử dụng mô hình tài liệu mặc định của nó.

Cho đến nay, các ví dụ trong bài viết này đã làm việc với mô hình tài liệu mặc định do Net Search Extender cung cấp. Các đặc điểm của mô hình tài liệu mặc định là:

  • Tất cả các phần của tài liệu được lập chỉ mục (đối với tài liệu XML, việc này bao gồm tất cả các phần tử và các thuộc tính).
  • Việc tìm kiếm có thể được cải tiến cho các phần tài liệu cụ thể khi sử dụng một cú pháp giống như XPath.
  • Không lập chỉ mục các giá trị số, do đó, không hỗ trợ các phép so sánh số hoặc tìm kiếm dải rộng.

Sử dụng một mô hình tài liệu tùy chỉnh cho phép:

  • Định nghĩa các phần tài liệu XML nào sẽ được lập chỉ mục và phần nào sẽ bị loại trừ.
  • Định nghĩa các tên tuỳ chỉnh cho các cây con XML, các phần tử hoặc các thuộc tính XML cụ thể.
  • Định nghĩa nội dung phần tử hoặc thuộc tính XML bằng số, cho phép các phép so sánh số hoặc tìm kiếm dải rộng trên nội dung này.

Bản thân mô hình tài liệu là một tài liệu XML theo sau một ngữ pháp được định nghĩa trước (với định nghĩa ngữ pháp này, hãy xem tài liệu Net Search Extender). Ví dụ, mô hình tài liệu, được định nghĩa trong một tệp, chỉ rõ một mô hình dùng để phân tích cú pháp và lập chỉ mục tài liệu có cấu trúc theo định dạng XML. Tệp mô hình được chuyển qua làm một tham số trong quá trình tạo chỉ mục và chỉ đọc trong lúc tạo chỉ mục; các thay đổi sau đó không ảnh hưởng đến các chỉ mục hiện tại.

Hình 5 định nghĩa một mô hình tài liệu tùy chỉnh trên cơ sở dữ liệu sản phẩm (tham khảo Liệt kê 1). Mô hình tài liệu được lưu trữ trong một tệp nsemodel.xml.

Hình 5. Một mô hình tài liệu tùy chỉnh
Một mô hình tài liệu tùy chỉnh NSE

Mỗi mô hình tài liệu XML bắt đầu bằng phần tử "XMLModel". Cho phép có hai phần tử XML cho XMLModel:

Bảng 2. Các phần tử modelfile (tệp mô hình) XML của NSE
Phần tử modelfile Mô tả
XMLFieldDefinitionPhần tử này định nghĩa một tên tuỳ chỉnh cho một phần, phần tử hoặc thuộc tính cụ thể của tài liệu XML, được xác định bằng cách sử dụng thuộc tính "locator" của "XMLFieldDefinition".
XMLAttributeDefinitionPhần tử này định nghĩa một thuộc tính NSE dựa trên một phần tử XML hoặc thuộc tính XML có thể được sử dụng để tìm kiếm số (tham số).

Thuộc tính locator

Cả hai phần tử mô hình, "XMLFieldDefinition" và "XMLAttributeDefinition," xác định phần của tài liệu XML nguồn bằng thuộc tính "locator" (định vị). Thuộc tính định vị hỗ trợ trục con (/), trục-chính nó-và-con cháu (//), và trục thuộc tính (@).

Hơn nữa, một tệp mô hình cũng hỗ trợ việc sử dụng các ký tự đại diện (*) trong đặc tả các vị trí. Ví dụ (1) trong Liệt kê 30 định nghĩa thuộc tính định vị nhận biết tất cả các phần tử con của phần tử "product". Trong ví dụ (2), thuộc tính định vị liên quan đến tất cả các thành phần con của phần tử "product" thuộc vùng tên cụ thể "ns".

Ngoài ra, có thể xác định các kiểu nút cụ thể bằng một thuộc tính định vị . Net Search Extender hỗ trợ các nút nhận xét (ví dụ 3 trong Liệt kê 30) và các chế độ hướng dẫn xử lý (PI). Ngoài ra, có thể định nghĩa sự kết hợp các phần tử như được hiển thị trong ví dụ 4.

Liệt kê 30. Các ví dụ cho các giá trị thuộc tính locator
(1) locator="/product/*"
(2) locator="/product/ns:*"
(3) locator="/product/comment()
(4) locator="name | details"

Tóm lại, thuộc tính định vị định nghĩa phần tài liệu nên được lập chỉ mục. Bạn có thể sử dụng một tập con của các biểu thức XPath để xác định các thuộc tính định vị:

  • Trục con ('/' or 'child::')
  • Trục-chính nó-và-con cháu ('//')
  • Trục thuộc tính ('@' hoặc 'attribute::')
  • Kiểm tra nút kiểu nhận xét ('comment()') và kiểm tra nút kiểu PI ('processing-instruction ()')
  • Kết hợp các nút ('|')
  • Ký tự đại diện ('*')

Thuộc tính tên

Thuộc tính "name" của một phần tử "XMLFieldDefinition" hoặc "XMLAttributeDefinition" định nghĩa tên thường dùng để chỉ ra một phần của cấu trúc tài liệu XML do giá trị của thuộc tính "locator" xác định.

Đối với định nghĩa các tên, có ba biến đặc biệt có sẵn hỗ trợ việc tạo một giá trị tên tự động:

Bảng 3. Các giá trị đặc biệt của thuộc tính tên
Giá trị thuộc tính Mô tả
name="$(NAME)"Biểu diễn tên đủ điều kiện (QName) của phần tử hoặc thuộc tính XML được biểu thức XPath của thuộc tính locator xác định.
name="$(LOCALNAME")Biểu diễn tên cục bộ (không có một tiền tố vùng tên) của phần tử XML được biểu thức XPath của thuộc tính locator xác định.
name="$(PATH)"Biểu diễn đường dẫn tuyệt đối đến phần tử hay thuộc tính XML được biểu thức XPath của thuộc tính locator xác định.

Ghi nhớ các đặc điểm của mô hình tài liệu mặc định, nó được định nghĩa như sau:

Hình 6. Định nghĩa mô hình tài liệu mặc định
Định nghĩa mô hình tài liệu mặc định

Thuộc tính kiểu

Chỉ có thể sử dụng thuộc tính "type" kết hợp với một phần tử "XMLAttributeDefinition". Giá trị duy nhất được phép là NUMBER, quy định rằng có thể sử dụng phần tử hay thuộc tính được xác định bởi thuộc tính định vị để tìm kiếm tham số.

Định nghĩa chỉ mục với một mô hình tài liệu tuỳ chỉnh

Một khi bạn đã định nghĩa một tệp mô hình tùy chỉnh, có thể dùng nó để tạo chỉ mục. Định nghĩa về một chỉ mục văn bản với một mô hình tài liệu tùy chỉnh trông như sau:

Liệt kê 31. Xác định một chỉ mục văn bản với một mô hình tài liệu tùy chỉnh
db2text create index ix2 for text on product(description)
                   format xml documentmodel XMLModel in nsemodel.xml

Tham số mô hình tài liệu được quy định lúc tạo chỉ mục xác định phần tử gốc trong tệp mô hình. Trong trường hợp của XML, phần tử gốc là <XMLModel>. Ngoài ra, bạn cần xác định vị trí (tên tệp của tệp mô hình).

Sau khi bạn tạo chỉ mục mới "ix2" dựa trên một mô hình tài liệu tùy chỉnh và cập nhật chỉ mục vừa mới được tạo ra, bạn có thể bắt đầu tìm kiếm cấu trúc tài liệu dựa trên các quy tắc được nêu trong mô hình tài liệu.

Tìm kiếm trong cấu trúc với một mô hình tài liệu tuỳ chỉnh

Theo các đặc điểm của mô hình tài liệu tùy chỉnh, một phần của cấu trúc tài liệu ở đó việc tìm kiếm sẽ xảy ra được xác định bằng tên, như được định nghĩa trong mô hình tài liệu. Bất kỳ các phần tài liệu khác, vẫn chưa được các thuộc tính định vị tương ứng nhận ra trong mô hình tài liệu, sẽ không được lập chỉ mục và do đó không thể tìm kiếm được.

Ví dụ, truy vấn sau trả về một kết quả bằng cách giới hạn việc tìm kiếm phần tài liệu được xác định bằng "description" tên trong mô hình tài liệu của Hình 5:

Liệt kê 32. Các kết quả truy vấn
SELECT pid
FROM product
WHERE CONTAINS(description,'SECTION("description") "pattern"')=1;

Tuy nhiên, việc phát hành truy vấn sau đây, dựa trên một chỉ mục được định nghĩa với mô hình tài liệu tùy chỉnh trong Hình 5, sẽ không có kết quả nào, mặc dù đã tham chiếu phần tương tự của tài liệu:

Liệt kê 33. Các kết quả truy vấn
SELECT pid
FROM product
WHERE CONTAINS(description, 'SECTION("/product/description/details") "pattern"')=1;

Tìm kiếm tham số

Dựa vào phần tử "XMLAttributeDefinition" trong tệp mô hình trong Hình 5, có thể tìm kiếm tham số trên các giá trị của phần tử "price" (giá). Truy vấn sau đây tìm ra các sản phẩm có mức giá trong dải từ 50 đến 120:

Liệt kê 34. Tìm kiếm tham số
SELECT pid
FROM product
WHERE CONTAINS(description, 'ATTRIBUTE "price" BETWEEN 50 AND 120')=1;

Điều gì sẽ xảy ra nếu bạn muốn tìm các sản phẩm có một mức giá cao hơn 120 Đô la Mỹ, vẫn dùng loại tiền này? Nhìn vào tài liệu XML ví dụ trong Hình 1, loại tiền này có sẵn như là một thuộc tính của phần tử XML "price". Ngoài phạm vi các tìm kiếm khi sử dụng từ khoá "BETWEEN", cũng có thể tìm kiếm tham số bằng các toán tử GREATER THAN ('>') và LESS THAN ('<'). Việc dùng loại tiền này đòi hỏi sử dụng hàm SQL/XML XMLEXISTS():

Liệt kê 35. Sử dụng hàm SQL/XML XMLEXISTS()
SELECT pid
FROM product
WHERE CONTAINS(description, 'ATTRIBUTE "price" > 120')=1 AND
      XMLEXISTS('$prod/product/description/price[@currency="us"]'
      passing description as "prod");

Tóm tắt

Net Search Extender của DB2 cung cấp một ngôn ngữ truy vấn linh hoạt để tìm ra thông tin liên quan dựa trên các hoạt động lấy ra phức tạp, ví dụ, bao gồm tìm kiếm kết hợp Boolean, tìm kiếm ký tự đại diện và tìm kiếm mờ. Theo cách ấy, có thể giới hạn việc tìm kiếm theo các phần tử XML hay các thuộc tính XML cụ thể trong cấu trúc tài liệu. Việc khai thác sức mạnh của một mô hình tài liệu tùy chỉnh của Net Search Extender cho phép cấu hình bổ sung tìm kiếm nhận biết-cấu trúc trong DB2.


Lời cảm ơn

Cảm ơn Cindy Saracco, Bert van der Linden, Stefan Momma và Michael Haide về đóng góp của họ cho bài viết này.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management
ArticleID=752554
ArticleTitle=Tìm kiếm toàn văn bản XML trong DB2
publish-date=08192011