2016-06-28 18 views
6

Chúng tôi bổ sung thêm một tìm kiếm miễn phí văn bản trên bảng sau:SQL Azure chứa không trả lại tất cả kết quả

| 1 | kayer-meyar | 
| 2 | KA-ME | 

Nhưng,

select * 
from Names 
where CONTAINS(name, '"ME*"') 

chỉ trả lại:

| 1 | kayer-meyar | 

Trong khi,

select * 
from Names 
where CONTAINS(name, '"KA*"') 

lợi nhuận cả:

| 1 | kayer-meyar | 
| 2 | KA-ME | 

khi chúng ta chạy:

select * 
from sys.dm_fts_parser('"KA-ME"', 1033, NULL, 0) 

lợi nhuận:

ka-me 
ka 
me 

Trả lời

3

Sau khi tìm kiếm và điều chỉnh vấn đề của bạn tôi đã tìm thấy hai lỗi nghiêm trọng trong việc tìm kiếm toàn văn:

  1. Dấu gạch ngang có thể được coi như một lời chia. Chỉ trả lại | 1 | kayer-meyar | khi tôi sử dụng '"ME*"'. nó không trả về | 2 | KA-ME |. Vấn đề là do tình trạng của bạn chỉ cho phép bắt đầu từ với (không phải end with hoặc in a middle) ME + at least one character. Bạn có thể nói, "sau đó làm cách nào để trả lại | 1 | kayer-meyar | làm chuỗi me nằm ở giữa từ này?". Vâng đó là bởi vì sert fulltext không coi nó như là một từ ngớ ngẩn, nó coi nó như là hai từ riêng biệt (một cái gì đó giống như kayer meyar) do đó nó lấp đầy sự requrement (me*). Một lần nữa trong trường hợp của KA-ME nó nhận dạng là KA ME thay vì một từ duy nhất và nó cũng thất bại điều kiện (mặc dù nó sao với ME nhưng không có thêm ký tự sau đó)
  2. Bạn đã thử xây dựng lại chỉ mục toàn văn? .

Bây giờ SOLUTION là: Tôi đã Tắt Danh sách Dừng cho Full Text Search Query Sử dụng truy vấn này cho điều này (tên bảng của tôi là MyTable):

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

sau đó chạy truy vấn của bạn. thời gian này bạn sẽ nhận được kết quả mong muốn của bạn. enter image description here

VÀ ĐÂY LÀ CỦA TÔI QUERY ĐẦY ĐỦ:

--CREATE TABLE MyTable 
--(
--Id INT IDENTITY(1,1), 
--Name varchar(max) Not Null 
--) 

---- To see if FULLTEXT installed or not 
--SELECT SERVERPROPERTY('IsFullTextInstalled') 

---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index 
---- https://technet.microsoft.com/en-us/library/ms187317.aspx 
---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index 
---- http://stackoverflow.com/questions/2315577/sql-server-2008-full-text-search-on-a-table-with-a-composite-primary-key 

--CREATE UNIQUE INDEX ui_MyTable ON MyTable(Id); 
--select name from sysindexes where object_id('MyTable') = id; 

--CREATE FULLTEXT CATALOG ft AS DEFAULT; 

--CREATE FULLTEXT INDEX ON MyTable(Name) 
-- KEY INDEX ui_MyTable 
-- WITH STOPLIST = SYSTEM; 
--GO 

--INSERT INTO MyTable(Name) VALUES('kayer-meyar'),('KA-ME'); 


ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

select * 
from MyTable 
where CONTAINS(Name, '"ME*"') 

select * 
from MyTable 
where CONTAINS(Name, '"KA*"') 
+0

cảm ơn, câu trả lời tuyệt vời! –

0

Thử chạy truy vấn: chọn * từ sys.dm_fts_parser ('" kayer- meyar "', 1033, NULL, 0)

ME là không phải là một từ trong Kayer-meyar và hecne bạn có thể không nhận được kết quả.

+0

Vui lòng đọc câu hỏi, kết quả duy nhất tôi nhận được là "kayer-meyar", vì bạn có thể thấy tôi là "tôi *" để tìm tất cả các từ tiền tố –

2

Các hành vi bạn mô tả là một hệ quả của việc sử dụng danh sách hệ thống các tệp từ dừng là đúng. Đây là hành vi mong đợi. "Me" là một từ dừng, tồn tại trong danh sách từ dừng hệ thống. Danh sách từ dừng hệ thống được sử dụng theo mặc định bởi quá trình lập chỉ mục dữ liệu.

Bạn có thể kiểm tra bản thân với kịch bản này:

select * from sys.dm_fts_parser('"KA-ME"', 1033, 0, 0) 

Tham số thứ ba ở đây là nhận dạng danh sách từ dừng. Khi bạn vượt qua NULL, các từ dừng không được xác định khi phân tích cú pháp và bạn thấy "ME" của loại "Đối sánh chính xác". Khi bạn vượt qua 0 làm tham số thứ ba, danh sách từ dừng hệ thống được sử dụng và "ME" sẽ thuộc loại "Noise Word". Điều này có nghĩa là SQL Server sẽ không lưu nó vào chỉ mục FTS để tìm kiếm. Như Raihan đã đề cập, bạn có thể tắt danh sách từ dừng hệ thống, nhưng đối với tôi, tắt hoàn toàn từ khóa là một cái búa quá lớn, đặc biệt là cho Cơ sở dữ liệu SQL Azure, vì bạn phải trả thêm không gian (chỉ mục FTS được lưu trữ trong cùng một cơ sở dữ liệu trong các bảng bên trong). Tạo một danh sách từ dừng mới (nhỏ hơn) và sử dụng nó cho FTS có thể là một giải pháp tốt hơn.

Các vấn đề liên quan