Xử lý từ khóa tìm kiếm cho bài viết bằng SQL

Trong bài viết thương yêu cầu có tìm kiếm từ khóa và mình cần hiển thị cho người dùng biết các từ khóa có liên quan đến bài viết. Bài viết này mình sẽ giới thiệu một cách để thực hiện.

Tuy chưa thực sự tối ưu vì trong thuật toán có dùng con trỏ để tìm kiếm. Nếu có thời gian chịu khó phân tích lại thì sẽ tối ưu thuật toán hơn.

Ví dụ bạn có bài viết được mô tả như sau:

Bạn sẽ thấy bên dưới phần diễn giải của bài viết có các từ khóa liên quan.
Để làm được điều đó bạn cần tạo một bảng (TB_TuKhoa) để lưu trữ những từ khóa (Gọi nôm na là kho từ khóa).

 

CREATE TABLE [dbo].[TB_TuKhoa](
    [idKey] [int] IDENTITY(1,1) PRIMARY KEY  NOT NULL,
    [TuKhoa] [nvarchar](250) NOT NULL,
    [GhiChu] [nvarchar](250) NULL,
)

 Ví dụ dữ liệu của bạn như sau:

 

Giờ chúng ta sẽ viết thuật toán để lấy ra các từ khóa.

 Bạn viết 1 hảm để trả về kết quả là từ khóa của bài viết như sau

* Input NoiDung bài viết (Nvarchar)
* Output: Từ khóa liên quan

CREATE FUNCTION GetKeyword(
    @NoiDung nvarchar(4000)
)
RETURNS NVarChar(4000) 
AS
BEGIN
    DECLARE @KetQua nvarchar(4000) SET @KetQua='Từ khóa: '
    -- Khai báo 1 bảng tạm
    DECLARE @_Table TABLE  (Noidung nvarchar(4000) null)
    INSERT INTO @_Table(Noidung) VALUES (@NoiDung)
    DECLARE @Count int
    --Dùng con trỏ (vòng lặp) để tìm kiếm từ khóa
    DECLARE @TuKhoa Nvarchar(250) 
    DECLARE TuKhoa_Cursor CURSOR FOR 
    SELECT TuKhoa  FROM TB_TuKhoa order by newid()
    OPEN TuKhoa_Cursor 
    FETCH NEXT FROM TuKhoa_Cursor INTO @TuKhoa 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    -- Nếu tìm thấy trong nội dung có từ khóa thì cộng thêm kết quả
     SELECT @Count =Count(*) FROM @_Table 
        WHERE Noidung LIKE N'%'+@TuKhoa+'%'
     IF @Count>0
        BEGIN
            SET @KetQua=@KetQua+@TuKhoa+', '
        END
    FETCH NEXT FROM TuKhoa_Cursor INTO @TuKhoa 
    END
    CLOSE TuKhoa_Cursor
    DEALLOCATE TuKhoa_Cursor

RETURN @KetQua
END

 Để sử dụng hàm trên và tránh việc mỗi lần view bài viết bạn lại yêu cầu thực hiện hàm đó thì  trong bảng bài viết (TB_BaiViet) của bạn tạo thêm trường Từ khóa
Dữ liệu trường này = dbo.GetKeyword(NoiDung)
 
Ví dụ:

SELECT dbo.GetKeyword(N'Bài viết này giới thiệu một số thủ thuật 
và lời khuyên liên quan đến những thắc mắc mà người dùng văn phòng 
thường gặp phải trong quá trình sử dụng Excel, Word.')

Sẽ cho kết quả là:  Từ khóa: WORD, Thủ thuật, EXCEL, lời khuyên, thắc mắc, người dùng , người dùng văn phòng , sử dụng Excel,