Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách sử dụng Từ dừng và Danh sách dừng để cải thiện Tìm kiếm toàn văn bản (FTS) của SQL Server

Bài viết hiện tại là về Stopwords và cách sử dụng Stoplist. Mục đích là làm cho Tìm kiếm toàn văn bản hiệu quả hơn về mặt lưu trữ và hiệu suất. Ngoài ra, những người đọc bài viết này sẽ nhận được hướng dẫn về việc triển khai Tìm kiếm toàn văn bản với Từ dừng và Danh sách dừng.

Bài viết cũng nêu bật tầm quan trọng của (các) Từ dừng và (các) Danh sách dừng để giữ cho Tìm kiếm toàn văn chính xác và tránh các từ nhiễu.

Hiểu từ dừng và danh sách dừng

Trước tiên, hãy làm rõ bản chất của Từ dừng và Danh sách dừng. Sau đó, chúng tôi sẽ tiếp tục sử dụng chúng để cải thiện Tìm kiếm toàn văn bản.

Danh sách dừng

Danh sách dừng, như tên của nó, là một danh sách các từ dừng. Khi được kết hợp với Tìm kiếm toàn văn bản, Danh sách dừng có thể lọc ra các từ hoặc thuật ngữ vô nghĩa, do đó cải thiện kết quả tìm kiếm.

Một từ dừng

Một từ dừng là một từ có vai trò nhỏ trong Tìm kiếm Toàn văn, mặc dù quan trọng về mặt ngữ pháp. Do đó, từ dừng là không cần thiết từ quan điểm Tìm kiếm toàn văn bản.

Theo tài liệu của Microsoft, một từ dừng có thể là một từ có một số nghĩa trong một ngôn ngữ cụ thể hoặc nó có thể là một số mã thông báo không có giá trị ngôn ngữ. Trong cả hai trường hợp, tìm kiếm toàn văn bản đều vô dụng.

Ví dụ về Từ dừng

Sau đây là các từ dừng bằng tiếng Anh (Anh / Mỹ):

  • như
  • tại
  • be
  • bởi vì
  • anh ấy
  • đã làm

Vì những từ trên không đóng góp vào Tìm kiếm Toàn văn, chúng là những từ dừng, mặc dù ý nghĩa của chúng trong việc hiểu một câu hoàn chỉnh.

(Các) danh sách dừng hệ thống

Mỗi ngôn ngữ được hỗ trợ, bao gồm cả tiếng Anh Anh, có một danh sách dừng mặc định hoặc hệ thống có thể được sửa đổi theo các yêu cầu cụ thể.

(Các) danh sách dừng tùy chỉnh

Người dùng có thể tạo danh sách dừng riêng / tùy chỉnh của họ, sử dụng danh sách dừng hệ thống hoặc từ đầu. Sẽ rất hữu ích khi ngăn các từ nhiễu trở thành một phần của kết quả Tìm kiếm Toàn văn.

Ngôn ngữ và Danh sách dừng

Tìm kiếm toàn văn bản hỗ trợ nhiều ngôn ngữ khác nhau. Mỗi ngôn ngữ được hỗ trợ có ít nhất một danh sách dừng hệ thống theo mặc định. Tuy nhiên, có thể có nhiều danh sách dừng cho bất kỳ ngôn ngữ nào, bao gồm cả danh sách dừng hệ thống và danh sách dừng tùy chỉnh.

Danh sách các ngôn ngữ được hỗ trợ

Chúng tôi có thể nhanh chóng kiểm tra danh sách tất cả các ngôn ngữ được hỗ trợ được sử dụng với Tìm kiếm toàn văn bản. Đối với điều này, hãy chạy tập lệnh T-SQL sau:

-- List of Full-Text Search supported languages
SELECT ftl.lcid,ftl.name FROM sys.fulltext_languages ftl

Kết quả như sau:

Truy vấn trên phiên bản SQL Server 2016 trả về tổng cộng 53 ngôn ngữ.

Sử dụng Từ dừng và Danh sách dừng với Tìm kiếm toàn văn bản

Bây giờ, chúng ta sẽ có được một số kinh nghiệm thực tế về việc tạo danh sách các từ dừng do người dùng xác định. Sau đó, chúng tôi sẽ sử dụng nó cho Tìm kiếm Toàn văn như một hướng dẫn. Nó sẽ giống như một kịch bản thời gian thực.

Điều kiện tiên quyết

Trước hết, bạn cần đảm bảo các yêu cầu sau để triển khai hướng dẫn một cách chính xác:

  • Có hiểu biết cơ bản về Tìm kiếm toàn văn bản
  • Khả năng triển khai Tìm kiếm Toàn văn trong SQL Server
  • Sự hiện diện của tùy chọn Tìm kiếm Toàn văn bản được bật / cài đặt trên phiên bản SQL mà bạn định sử dụng

Để đảm bảo các điều kiện tiên quyết đó, hãy xem qua các bài viết dưới đây nếu bạn đã quen với kịch bản T-SQL:

  • Triển khai Tìm kiếm Toàn văn trong SQL Server 2016 cho người mới bắt đầu
  • Triển khai Tìm kiếm Toàn văn trong SQL Server 2016 cho Người dùng Nâng cao

Kiểm tra trạng thái Tìm kiếm toàn văn bản

Chạy truy vấn sau để kiểm tra xem bạn đã cài đặt Tìm kiếm toàn văn bản vào phiên bản SQL của mình chưa:

-- Is Full-Text Search installed then 1 or 0
SELECT fulltextserviceproperty('IsFulltextInstalled') as [Full-Text Search]

Kết quả của tập lệnh trên sẽ trả về 1 như sau:

Nếu bạn nhận được bất kỳ số nào khác với 1, hãy tham khảo lại các bài viết được đề cập ở trên.

Thiết lập cơ sở dữ liệu mẫu (WatchReviewsStoplist)

Trước tiên, bạn cần thiết lập cơ sở dữ liệu mẫu có tên WatchReviewsStoplist . Sử dụng tập lệnh dưới đây:

-- Create WatchReviewsStoplist database
CREATE DATABASE WatchReviewsStoplist;
GO

-- Connect to the sample database
USE WatchReviewsStoplist

-- (2) Create WatchReview table
CREATE TABLE [dbo].[WatchReview]
(
	[ReviewId] INT NOT NULL IDENTITY , 
    [Date] DATETIME2 NULL, 
    [Person] VARCHAR(50) NULL, 
    [Details] VARCHAR(1000) NULL, 
    CONSTRAINT [PK_WatchReview] PRIMARY KEY (ReviewId)
)

-- (3) Populate WatchReview table
SET IDENTITY_INSERT [dbo].[WatchReview] ON
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (1, N'2020-01-01 00:00:00', N'Atif', N'Hi, I have just bought this Casio black digital watch which is excellent and has date, alarm, stopwatch and timer as well.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (2, N'2020-01-02 00:00:00', N'Qasim', N'Hi, I have just bought this Casio black analog watch which is average and slightly discomforting and just got date and time.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (3, N'2020-01-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like alarm, stopwatch, date and timer. ')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-01-10 00:00:00', N'Brian ', N'Hi, I have just ordered this Seiko black digital watch which is excellent and has date, alarm and timer.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (5, N'2020-01-11 00:00:00', N'Sarah', N'Hi, I have just ordered this Seiko white analog watch which is average and has alarm, date and timer.')
SET IDENTITY_INSERT [dbo].[WatchReview] OFF

Kiểm tra cơ sở dữ liệu mẫu

Chạy tập lệnh T-SQL sau để xem nội dung bảng trong cơ sở dữ liệu mẫu:

-- Check sample database
SELECT wr.ReviewId,wr.Person,wr.Details FROM dbo.WatchReview wr

Kết quả như sau:

Kịch bản danh sách dừng

Giả sử rằng chúng tôi đã yêu cầu nhóm phát triển cải thiện Tìm kiếm toàn văn cho các đánh giá của khách hàng. Họ nên làm điều đó bằng cách loại trừ các từ nhiễu. Bằng cách này, Tìm kiếm Toàn văn vẫn hiệu quả và cũng tập trung.

Để đáp ứng các yêu cầu này, trước tiên chúng ta cần thiết lập Tìm kiếm toàn văn bản. Nó có nghĩa là thực hiện các hành động sau:

  • Tạo Danh mục Toàn văn
  • Tạo một Danh sách dừng trống tùy chỉnh hoặc do người dùng xác định
  • Tạo chỉ mục Toàn văn

Tạo danh mục toàn văn bản

Tạo một danh mục toàn văn với tập lệnh sau:

-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO

Tạo một danh sách dừng tùy chỉnh trống

Tạo danh sách dừng tùy chỉnh trống với tập lệnh sau:

-- Create empty custom stoplist
CREATE FULLTEXT STOPLIST [WatchReviewStoplist];
GO  

Danh sách dừng tùy chỉnh hiện đã được tạo.

Tạo chỉ mục toàn văn bản

Cuối cùng, tạo Chỉ mục toàn văn trong cột Chi tiết cho ngôn ngữ Anh Anh. Nó sẽ trỏ đến danh sách dừng tùy chỉnh đã tạo trước đó. Sử dụng tập lệnh T-SQL sau cho hành động này:

-- Create Full-Text index pointing to the previously created Stoplist
CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English]) 
   KEY INDEX PK_WatchReview  
   WITH STOPLIST = WatchReviewStoplist;  
GO  

Truy vấn toàn văn bản để được khách hàng đánh giá là chiếc đồng hồ xuất sắc

Chạy truy vấn toàn văn bản sau để tìm ra sản phẩm (đồng hồ) nào được khách hàng đánh giá cao:

--Search customer reviews where the product was rated excellent
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'excellent') 

Kết quả như sau:

Chúng tôi có thể thấy rằng khách hàng đã đánh giá xuất sắc đồng hồ kỹ thuật số màu đen. Do đó, chúng tôi biết sản phẩm tốt nhất dựa trên các bài đánh giá và chúng tôi hiểu rằng Tìm kiếm toàn văn bản hoạt động tốt.

Tuy nhiên, có một số lo ngại mà bạn có thể bỏ qua đối với bảng năm hàng, nhưng nó có thể mang lại cho chúng tôi lợi ích về hiệu suất và lưu trữ trong một tập hợp kết quả tương đối lớn nếu được giải quyết kịp thời.

Tìm kiếm từ nhiễu "Hi" với truy vấn toàn văn bản

Có nhiều từ nhiễu được đính kèm với chỉ mục Toàn văn. Chẳng bao lâu, họ có thể trở thành gánh nặng. Thêm vào đó, họ không sử dụng để tìm kiếm.

Hãy kiểm tra xem từ tạp âm Xin chào xuất hiện trong kết quả Tìm kiếm Toàn văn vì tốt hơn nên loại trừ nó.

Chạy truy vấn Toàn văn như sau:

--Run Full-Text query to Search for Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Kết quả như sau:

Kết quả trả về cho thấy từ “Xin chào” là một phần của kết quả tìm kiếm Toàn văn. Do đó, chúng ta cần loại trừ nó - nó vô nghĩa đối với việc tìm kiếm và không giúp ích cho bất kỳ phân tích nào.

Danh sách dừng thay thế để thêm từ dừng Xin chào

Chúng tôi sẽ thêm từ dừng Xin chào bằng cách thay đổi Danh sách dừng tùy chỉnh của chúng tôi để danh sách này không thể được lập chỉ mục bởi tìm kiếm Toàn văn và không được trả lại bởi các truy vấn Toàn văn để tiết kiệm dung lượng và cải thiện tìm kiếm:

--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchReviewStoplist
ADD 'Hi' LANGUAGE 'British English';  

Tìm kiếm lại từ "Hi" sau khi thêm nó làm Từ dừng

Tìm kiếm từ nhiễu Hi sau khi thêm nó vào Danh sách dừng:

--Search Noise word 'Hi' after it has been added as a stopword
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Kết quả như sau:

Kiểm tra các Từ dừng đã thêm

Bất cứ lúc nào, bạn có thể kiểm tra các từ dừng được thêm vào Danh sách dừng. Chạy tập lệnh sau cho việc này:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Kết quả như sau:

Xin chúc mừng! Bạn đã tạo thành công một danh sách dừng và thêm một từ dừng vào đó. Bằng cách này, bạn làm cho Tìm kiếm Toàn văn hiệu quả hơn về cả hiệu suất và dung lượng.

Việc cần làm

Bây giờ bạn có thể tạo danh sách dừng và thêm từ dừng cho chúng, hãy thử các cách sau để cải thiện hơn nữa kỹ năng của bạn:

  • Thêm các từ ‘tôi,’ ‘cái này,’ ‘chỉ’ ‘làm từ nhiễu vào danh sách dừng tùy chỉnh của bạn được tạo trong hướng dẫn này.
  • Kiểm tra các từ dừng đã thêm bằng cách chạy tập lệnh mà chúng tôi đã chỉ định ở cuối hướng dẫn.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vui lòng giúp cải thiện số liệu thống kê của SQL Server!

  2. XÓA hàng loạt trên SQL Server 2008 (Có bất kỳ điều gì giống như Sao chép hàng loạt (bcp) để xóa dữ liệu không?)

  3. Làm cách nào để tạo khóa chính làm AUTOINCREMENT

  4. Viết CTE đệ quy bằng cách sử dụng Entity Framework Cú pháp thông thạo hoặc cú pháp nội tuyến

  5. SQL Client dành cho Mac OS X hoạt động với MS SQL Server