Cấp bậc tác giả:

DATABASE

Tạo chức năng tìm kiếm cho web truy vấn dữ liệu Store

Được viết bởi QuangIT ngày 14/09/2012 lúc 11:55 AM
Chức năng tìm kiếm gần như là bắt buộc đối với mỗi website. Có nhiều cách để xây dựng chức năng tìm kiếm, trong bài viết này tôi chia sẻ với các bạn một cách xây dựng chức năng tìm kiếm cho trang web với việc viết Store truy vấn dữ liệu theo điều kiện tìm kiếm.
  • 0
  • 9326

Tạo chức năng tìm kiếm cho web truy vấn dữ liệu Store

Chức năng tìm kiếm gần như là bắt buộc đối với mỗi website. Có nhiều cách để xây dựng chức năng tìm kiếm, trong bài viết này tôi chia sẻ với các bạn một cách xây dựng chức năng tìm kiếm cho trang web với việc viết Store truy vấn dữ liệu theo điều kiện tìm kiếm.


Thông thường chức năng tìm kiếm trên trang web thường có 1 Textbox và một Button để người dùng nhập từ khóa và tìm kiếm. Nếu muốn tìm kiếm nhiều điều kiện bạn lại điều hướng người dùng đến chức năng tìm kiếm nâng cao. Ở bài này có lẽ tôi chỉ minh họa cách viết thủ tục truy vấn dữ liệu theo từ khóa thôi nhé, các điều kiện khác nếu cần thêm vào cũng không khó, điều quan trọng là cách làm để bạn có thể áp dụng.


Giả sử tôi tìm kiếm với từ khóa "chức năng tìm kiếm". Khi đó tôi sẽ phân tích từ khóa và viết thủ tục để tìm kiếm với các từ khóa "chức năng tìm kiếm","chức năng tìm","chức năng","chức","năng","tìm","kiếm" và ở kết quả tìm kiếm bạn sẽ đánh dấu các từ khóa tìm kiếm (Highlighting Keywords) . Ta sẽ viết hàm phân tích từ khóa này như sau:


Trước tiên ta cần hàm tách chuỗi thành mảng


CREATE FUNCTION fnSplit(
    @strInput NVARCHAR(4000),
    @char char(1)) 
RETURNS @Tbl TABLE (id int IDENTITY(1,1),part NVARCHAR(1000))
AS
BEGIN
    DECLARE @SubStr NVARCHAR(100), @i INT
    SET @i = CHARINDEX(@char, @strInput, 0)
    WHILE @i > 0
    BEGIN
        SET @SubStr = LEFT(@strInput,@i-1)
        INSERT INTO @Tbl
        SELECT @SubStr
        SET @strInput = SUBSTRING(@strInput, @i+1,4000)
        SET @i = CHARINDEX(@char, @strInput, 0)
    END    
    INSERT INTO @Tbl
    SELECT LTRIM(RTRIM(@strInput))
    RETURN
END


Hàm này sẽ tách chuỗi đưa vào với ký tự đại diện (Giống như hàm Split trong C# vậy)


Tiếp theo ta viết hàm phân tích chuỗi như sau:


CREATE FUNCTION fKeySearch(@strInput NVARCHAR(400), @char char(1)) 
RETURNS @_TblTemp TABLE (id int IDENTITY(1,1),part NVARCHAR(400))
AS
BEGIN
    DECLARE @SubStr NVARCHAR(100), @i INT, @p nvarchar(400)
    SET @p=@strInput
    INSERT INTO @_TblTemp
        SELECT @strInput
    SET @i = CHARINDEX(@char, REVERSE(@strInput))
    WHILE @i >0
    BEGIN
        SET @SubStr = right(@strInput,CHARINDEX(@char, REVERSE(@strInput))) 
        SET @strInput = replace(@strInput,@SubStr,'')
        INSERT INTO @_TblTemp
        SELECT @strInput
        SET @i = CHARINDEX(@char, REVERSE(@strInput))
    END    
    INSERT INTO @_TblTemp
    SELECT part FROM dbo.fnSplit(@p,@char) WHERE id>1 AND len(rtrim(ltrim(part)))>2
    RETURN
END


Khi truy vấn hàm này bạn sẽ có kết quả tương tự như sau: (Bạn có thể tối ưu thêm hàm này nếu bạn thích nhé)

Giả sử tôi có bảng TB_TroChoi với các trường  TieuDe, AnhDaiDien, MoTa, id, TrangThai, ... Ta sẽ dùng kỹ thuật bảng tạm và vòng lặp để thực hiện truy vấn dữ liệu theo từ khóa tìm kiếm như sau


CREATE PROCEDURE TB_TroChoi_Search
    @TuKhoa nvarchar(300),
    @char char(1)
AS
BEGIN
    DECLARE @_Table_GameSearch_Temp TABLE(
    indexs int IDENTITY (1,1) NOT NULL,
    Title nvarchar(250),
    ImgUrl nvarchar(250),
    Descript nvarchar(500),
    id int)
    DECLARE @cr int, @part nvarchar(400), @check int
    DECLARE @mRow int
     SELECT @mRow = isnull(Max([id]),0) FROM dbo.fKeySearch(@TuKhoa,@char)
    SET @cr = 1
    WHILE @cr <=@mRow
    BEGIN
        SELECT @part=part FROM dbo.fKeySearch(@TuKhoa,@char) WHERE id=@cr
        INSERT   INTO @_Table_GameSearch_Temp(Title, ImgUrl, Descript,id)
         SELECT replace(tg.TieuDe, @part,'<u>'+@part+'</u>') AS Title,tg.AnhDaiDien, tg.MoTa, tg.id
         FROM TB_TroChoi_Search tg WHERE (tg.TieuDe LIKE '%'+@part+' %' OR tg.MoTa LIKE '%'+@part+' %') AND tg.TrangThai=1
           AND tg.id NOT IN (SELECT tm.id FROM @_Table_GameSearch_Temp tm)
        SET @cr = @cr + 1
    END
    SELECT  Title, ImgUrl, Descript, id
    FROM  @_Table_GameSearch_Temp
    ORDER BY indexs
END


Trong thủ tục trên bạn thấy tôi truy vấn với điều kiện like với mỗi từ khóa ở hàm phân tích từ khóa trên và insert nó vào bảng tạm với điều kiện là các id tìm thấy của từ khóa sau không được thêm vào nữa khi đã có trong bảng tạm ( AND tg.id NOT IN (SELECT tm.id FROM @_Table_GameSearch_Temp tm) ) và đánh dấu các từ khóa bằng lệnh replace(tg.TieuDe, @part,'<u>'+@part+'</u>') AS Title


Trên đây là tôi minh họa chức năng tìm kiếm cho website của bạn, Hy vọng sẽ hữu ích đối với các bạn đang gặp vấn đề khi xây dựng chức năng tìm kiếm. Bạn cũng có thể sử dụng công cụ tìm kiếm tùy chỉnh của google.

Nguồn bài viết: Sưu tầm

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML