2016-04-08 18 views
5

Tôi đã quen sử dụng Lucene để tìm kiếm toàn văn và nó hoạt động rất tốt, nhưng cơ sở dữ liệu chính của tôi là SQL. Tôi không thích ý tưởng có hai cơ chế cho cơ sở dữ liệu và quyết định sử dụng SQL Full Text Search. Những điều làm việc rất tốt, nhưng vẫn còn một số điều mà tôi đã không tìm ra. phép nói rằng tôi có bảng dưới đây:SQL Full Text Kết quả tìm kiếm ưu tiên

enter image description here

Tất cả các lĩnh vực được lập chỉ mục cho tìm kiếm văn bản đầy đủ.

Bây giờ tôi muốn thực hiện tìm kiếm toàn văn trên bảng này với văn bản "Isaac". Và tôi muốn hàng 5 nằm ở trên cùng và phần còn lại của kết quả nằm dưới đó. Tôi có thể đặt mức độ ưu tiên cho một trường để mọi thứ được tìm thấy trên trường đó sẽ vẫn ở trên cùng của kết quả không? Về cơ bản tôi muốn ưu tiên nó theo lĩnh vực này. Trong bảng thực của tôi, tôi có 6 trường.

+0

bạn đang sử dụng loại DB nào? –

+0

@ Mr.P Tôi đang sử dụng MS SQL – Dilshod

Trả lời

1

Theo như tôi biết MSSQL không hỗ trợ so sánh chuỗi tương đồng .. bạn phải viết thiết lập riêng của mình các chức năng

-- get percentage diff 
CREATE FUNCTION [dbo].[GetPercentageOfTwoStringMatching] 
(
    @string1 NVARCHAR(100) 
    ,@string2 NVARCHAR(100) 
) 
RETURNS INT 
AS 
BEGIN 

    DECLARE @levenShteinNumber INT 

    DECLARE @string1Length INT = LEN(@string1) 
    , @string2Length INT = LEN(@string2) 
    DECLARE @maxLengthNumber INT = CASE WHEN @string1Length > @string2Length THEN @string1Length ELSE @string2Length END 

    SELECT @levenShteinNumber = [dbo].[LEVENSHTEIN] ( @string1 ,@string2) 

    DECLARE @percentageOfBadCharacters INT = @levenShteinNumber * 100/@maxLengthNumber 

    DECLARE @percentageOfGoodCharacters INT = 100 - @percentageOfBadCharacters 

    -- Return the result of the function 
    RETURN @percentageOfGoodCharacters 

END 

-- get diff of strings 
CREATE FUNCTION [dbo].[LEVENSHTEIN](@left VARCHAR(100), 
            @right VARCHAR(100)) 
returns INT 
AS 
    BEGIN 
     DECLARE @difference INT, 
       @lenRight  INT, 
       @lenLeft  INT, 
       @leftIndex  INT, 
       @rightIndex INT, 
       @left_char  CHAR(1), 
       @right_char CHAR(1), 
       @compareLength INT 

     SET @lenLeft = LEN(@left) 
     SET @lenRight = LEN(@right) 
     SET @difference = 0 

     IF @lenLeft = 0 
     BEGIN 
      SET @difference = @lenRight 

      GOTO done 
     END 

     IF @lenRight = 0 
     BEGIN 
      SET @difference = @lenLeft 

      GOTO done 
     END 

     GOTO comparison 

     COMPARISON: 

     IF (@lenLeft >= @lenRight) 
     SET @compareLength = @lenLeft 
     ELSE 
     SET @compareLength = @lenRight 

     SET @rightIndex = 1 
     SET @leftIndex = 1 

     WHILE @leftIndex <= @compareLength 
     BEGIN 
      SET @left_char = substring(@left, @leftIndex, 1) 
      SET @right_char = substring(@right, @rightIndex, 1) 

      IF @left_char <> @right_char 
       BEGIN -- Would an insertion make them re-align? 
        IF(@left_char = substring(@right, @rightIndex + 1, 1)) 
        SET @rightIndex = @rightIndex + 1 
        -- Would an deletion make them re-align? 
        ELSE IF(substring(@left, @leftIndex + 1, 1) = @right_char) 
        SET @leftIndex = @leftIndex + 1 

        SET @difference = @difference + 1 
       END 

      SET @leftIndex = @leftIndex + 1 
      SET @rightIndex = @rightIndex + 1 
     END 

     GOTO done 

     DONE: 

     RETURN @difference 
    END 

và sau đó bạn sẽ thêm video này vào đặt hàng của bạn bằng cách

SELECT * 
FROM [dbo].[some_table] 
ORDER BY [dbo].[GetPercentageOfTwoStringMatching](col1 ,col2) DESC 

Thích ứng nó để DTB của bạn, nhưng điều này sẽ làm việc cho bạn


Hoặc bạn có thể đặt CA đơn giản SE KHI điều kiện để tạo cột thứ tự

SELECT * 
FROM [dbo].[table] 
ORDER BY 
     CASE 
      WHEN str = 'search_string' THEN 1 
      WHEN str LIKE '%search_string%' THEN 2 
      ELSE 3 
     END 
Các vấn đề liên quan