2011-07-10 35 views
7

Hãy xem xét ví dụ sauCách sử dụng TÌM KIẾM ĐẦY ĐỦ TEXT trong Cơ sở dữ liệu H2?

CREATE ALIAS IF NOT EXISTS FT_INIT FOR "org.h2.fulltext.FullText.init"; 
CALL FT_INIT(); 
DROP TABLE IF EXISTS TEST; 
CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR); 
INSERT INTO TEST VALUES(1, 'Hello World'); 
CALL FT_CREATE_INDEX('PUBLIC', 'TEST', NULL); 

và tôi đã thực hiện các truy vấn sau đây

SELECT * FROM FT_SEARCH('Hello', 0, 0); 

Nhưng truy vấn này đang trở lại "PUBLIC". "TEST" WHERE "ID" = 1.

  1. Tôi có phải thực hiện lại thao tác này "PUBLIC"."TEST" WHERE "ID"=1 để nhận bản ghi chứa từ 'Hello' không?
  2. Truy vấn tìm kiếm tất cả các bản ghi có từ 'ell' trong chúng từ FT_Search là gì. chẳng hạn như như% ell% trong H2 Native Full-Text Search

Trả lời

8
  1. Vâng, mỗi hàng trong một truy vấn sử dụng FT_SEARCH đại diện cho một schema-table-hàng nơi một trong những từ khóa được tìm thấy. Tìm kiếm phân biệt chữ hoa chữ thường và thông số text thành FT_SEARCH có thể bao gồm nhiều từ. Ví dụ,

    DELETE FROM TEST; 
    INSERT INTO TEST VALUES(1, 'Hello World'); 
    INSERT INTO TEST VALUES(2, 'Goodbye World'); 
    INSERT INTO TEST VALUES(3, 'Hello Goodbye'); 
    CALL FT_REINDEX(); 
    SELECT * FROM FT_SEARCH('hello goodbye', 0, 0); 
    

    lợi nhuận chỉ chèo ba:

    QUERY       SCORE 
    "PUBLIC"."TEST" WHERE "ID"=3 1.0 
    

    Cũng lưu ý rằng FT_SEARCH_DATA có thể được sử dụng để lấy dữ liệu riêng của mình. Ví dụ,

    SELECT T.* FROM FT_SEARCH_DATA('hello', 0, 0) FT, TEST T 
    WHERE FT.TABLE='TEST' AND T.ID=FT.KEYS[0]; 
    

    lợi nhuận cả hai hàng có chứa từ khóa:

    ID NAME 
    1 Hello World 
    3 Hello Goodbye 
    
  2. Apache Lucene hỗ trợ wildcard tìm kiếm, mặc dù hàng đầu ký tự đại diện (ví dụ * ell) có xu hướng đắt tiền.

+0

Đó chính xác là những gì tôi muốn. Cảm ơn bạn. – Vivek

+0

một lần nữa là có cách nào để lập chỉ mục cơ sở dữ liệu h2 với lucene nếu có bất kỳ cho tôi biết. – Vivek

+0

[Sử dụng Tìm kiếm toàn văn Lucene] (http://www.h2database.com/html/tutorial.html#fulltext) rất giống nhau, bạn chỉ cần libene Lucene trong đường dẫn lớp của bạn. – trashgod

3

Do tôi có để một lần nữa thực hiện điều này "PUBLIC". "TEST" WHERE "ID" = 1 để có được những kỷ lục có chứa từ 'Hello'?

Có, trừ khi bạn sử dụng tham gia như được mô tả bằng thùng rác. Lý do là: các hàng thường lớn hơn nhiều so với chỉ hai từ. Ví dụ, một hàng có chứa một CLOB với một tài liệu. Nếu kết quả tìm kiếm toàn văn bản có chứa dữ liệu thì tìm kiếm toàn văn sẽ chậm hơn nhiều.

Truy vấn tìm kiếm tất cả các bản ghi có từ 'ell' trong chúng từ FT_Search là gì. chẳng hạn như% ell% trong Tìm kiếm toàn văn bản gốc H2

Tìm kiếm toàn văn gốc không thể thực hiện điều đó trực tiếp. Lý do là: tìm kiếm toàn văn chỉ lập chỉ mục toàn bộ các từ. (Nhân tiện: Google có hỗ trợ tìm kiếm nếu bạn chỉ biết một phần của một từ không? Apache Lucene không hỗ trợ nó) Trên thực tế, đối với H2, sẽ có cách: đầu tiên, tìm kiếm bảng từ (FT.WORDS) cho các trận đấu, và sau đó sử dụng tìm kiếm thông thường.

+0

Có, Lucene hỗ trợ [ký tự đại diện] (http://wiki.apache.org/lucene-java/LuceneFAQ#What_wildcard_search_support_is_available_from_Lucene.3F); Tôi đã sửa liên kết bị hỏng (trước đó) trong câu trả lời của tôi. Ý tưởng tốt về tìm kiếm 'FT.WORDS' cho các kết quả khớp một phần. – trashgod

+0

Trên thực tế, vì tìm kiếm văn bản đầy đủ thông thường kết nối các cụm từ tìm kiếm bằng cách sử dụng AND, chỉ cần tìm kết quả từ FT.WORDS trong một truy vấn có thể không hoạt động. Giả sử bạn muốn tìm kiếm 'AB%', truy vấn FT.WORDS có thể trả về 'ABCDE' và' ABXYZ' làm ứng viên từ. Bây giờ tìm kiếm văn bản đầy đủ thông thường cho 'ABCDE ABXYZ' sẽ trả lại giao lộ, rất có thể là tập hợp trống. Để sử dụng phương pháp FT.WORDS, trước tiên bạn sẽ cần mở rộng cụm từ 'AB%' của bạn và sau đó gọi tìm kiếm toàn văn cho mỗi mở rộng. Và nếu bạn có nhiều cụm từ tìm kiếm, bạn sẽ phải tìm kiếm * tất cả các kết hợp *. – hendrik

Các vấn đề liên quan