THÍCH để chọn sự tồn tại độc lập của từ bất cứ nơi nào trong văn bản


7

nhập mô tả hình ảnh ở đây

Tôi có một bảng với các văn bản sau và từ khóa tôi đang tìm kiếm là 'Tìm kiếm'. Vì vậy, tôi đã viết một truy vấn

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   [TextValue] LIKE '%Search%'

H.1 Làm cách nào tôi có thể sửa đổi truy vấn để chỉ các bản ghi có 'Tìm kiếm' trong văn bản được trả về và không nên lấy 'Tìm kiếm'. tức là theo hình ảnh ba bản ghi đầu tiên chỉ được trả lại.?


bởi vì Tìm kiếm và LSearch là một số tham số thay thế (tôi nghĩ), hãy sử dụng: sz KHÔNG THÍCH '% LSearch%' VÀ sz THÍCH '% Tìm kiếm%'
garik

câu hỏi hay, vì nhiều người trong chúng ta không biết các ký tự đại diện có sẵn có thể được sử dụng với THÍCH. Tôi đang thêm liên kết / tài liệu tham khảo này , có thể giúp bất cứ ai muốn biết thêm về nó.
CoderHawk

và một từ MSDN
CoderHawk

Câu trả lời:


8

Sử dụng THÍCH

  • Một dòng như tìm kiếm:

    WHERE
     ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
    
    /* [] contains list of allowable characters, adding spaces around 
       [TextValue] removes need to have multiple OR [TextValue] LIKE */
  • Nếu không có phần đệm, bạn sẽ cần xử lý cụ thể chuỗi xuất hiện ở đầu / cuối chuỗi:

    WHERE
        [TextValue] LIKE '%Search%' --middle
        OR
        [TextValue] LIKE 'Search%'   --start
        OR
        [TextValue] LIKE '%Search'   --end

Sử dụng FULLTEXT INDEX

Edit2, cho toàn bộ văn bản thuần túy

CREATE FULLTEXT INDEX trên trạng thái MSDN cho tùy chọn AUTO (mặc định)

Mặc dù các thay đổi được lan truyền tự động, những thay đổi này có thể không được phản ánh ngay lập tức trong chỉ mục toàn văn.

Vì vậy, nó có thể không cho kết quả chính xác. Nhưng sau đó vài giây nó sẽ.

Ngoài ra, với tối đa một vài hàng 10k, nó sẽ thực hiện đầy đủ: nó chia tỷ lệ O (n). Tôi sử dụng THÍCH trên một bảng có khoảng 25 nghìn hàng nhưng người dùng biết rằng nó sẽ hoạt động kém nếu họ tìm kiếm theo cách này (trên trang "nâng cao"). Tôi có được sự đánh đổi bằng cách quản lý một chỉ mục toàn văn

Tìm kiếm toàn văn không phải giải pháp chính xác, đó là một lựa chọn

Lưu ý: Kinh nghiệm đã cho tôi thấy rằng lập chỉ mục FullText trong SQL Server có ý nghĩa hiệu suất nghiêm trọng, nghĩa là: Chỉ thực hiện nếu bạn thực sự cần và bạn biết bạn đang làm gì! (@Andrew Bickerton)


Có vẻ ổn. Nhưng có cách nào khác tôi có thể mang nó qua bất kỳ biểu thức thẻ hoang dã nào không ?. Thực tế tôi đang thực hiện nó trong một truy vấn tìm kiếm. Và tôi đang cố gắng giảm dòng mã.
balu

Tôi đã thử bằng cách thêm khoảng trắng nhưng nó không trả về bản ghi đầu tiên, tức là từ khóa ở đầu văn bản.
balu

@balu: Bạn có đang chạy mã chính xác này sau khi chỉnh sửa của tôi không?
gbn

Tôi không thích downvoters. Đừng lo lắng. Nếu câu trả lời nhanh của tôi không chính xác, tôi cảm ơn bạn vì nước lạnh. Tôi không có thời gian để trả lời nhanh (chỉnh sửa) câu trả lời của mình.
garik

2
Đây không phải là một giải pháp mở rộng. Trong sẽ sử dụng quét chỉ mục hoặc quét bảng. Khi bảng tăng số lượng thời gian tìm kiếm, bảng sẽ tăng lên đáng kể. Tùy chọn toàn văn hiển thị là tùy chọn nên được sử dụng.
mrdenny

6

Nếu bảng của bạn sẽ có số lượng hàng không tầm thường, bạn có thể muốn thử chỉ mục FULLTEXT thay thế. Nó sẽ nhanh hơn nhiều và sẽ chỉ khớp với từ chính xác.

CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;

CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
    KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table

Bây giờ tìm kiếm văn bản của bạn:

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   CONTAINS([TextValue], 'Search')

Thêm về:


Tìm kiếm toàn văn trong SQL Server sẽ là cách hiệu quả duy nhất để tìm kiếm dữ liệu. Bất kỳ cách nào khác mà tôi có thể nghĩ đến sẽ yêu cầu quét chỉ mục hoặc quét bảng.
mrdenny

1

Tôi không biết máy chủ SQL có hỗ trợ \btrong regexes không (khớp với ràng buộc từ). Và bạn sẽ phải tạo một hàm do người dùng xác định để cho phép kết hợp regex ở vị trí đầu tiên , nhưng nếu có, bạn có thể khớp với:

\bSearch\b

Nếu không, bạn vẫn có thể kết hợp trên:

(^| )Search( |$)

1
Tại thời điểm này, SQL Server không hỗ trợ tìm kiếm regex gốc bằng cách sử dụng THÍCH. CLR là một lựa chọn, nhưng chậm.
Eric Humphrey - lotahelp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.