2011-10-10 51 views
5

có vấn đề với dấu và (&)SQL Server Full Text Search dấu và (&)

Làm thế nào để tìm kiếm các từ (hoặc câu) có chứa một dấu và (&).

Ví dụ, trong cơ sở dữ liệu bao gồm:

1: "Johnson & Johnson" 
2: "AT&T" 
3: "Sample & Sample" 

Làm thế nào tôi nên viết một văn bản truy vấn tìm kiếm toàn để tìm kiếm hồ sơ cá nhân?

SELECT * from Companies c WHERE CONTAINS(c.CompanyName, '"AT&T"') 

Tôi biết rằng ký tự (&) chịu trách nhiệm về hoạt động logic và logic. Nhưng tôi không biết làm thế nào để mã hóa nó để tìm kiếm trong văn bản với việc sử dụng tìm kiếm toàn văn.

Bất kỳ ý tưởng nào?

Trả lời

5

phiên bản ngắn: Bạn không thể (hoặc ít nhất bạn có thể, nhưng bạn có thể nhận được nhiều kết quả hơn bạn mong đợi)

phiên bản Long: Nhân vật '&' được coi là một "máy cắt chữ" , tức là khi SQL Server gặp '&', nó xử lý nó như là khởi đầu của một từ mới "" (tức là mã thông báo). Máy chủ SQL được phân tích khi phân tích cú pháp "AT&T" là hai mã thông báo, "AT""T".

Bạn có thể kiểm tra điều này cho chính mình sử dụng sys.dm_fts_parser:

SELECT * FROM sys.dm_fts_parser('AT&T', 1033, 0, 0) 

keyword  group_id phrase_id occurrence special_term display_term expansion_type source_term 
----------- ----------- ----------- ----------- ------------- ------------- -------------- ----------- 
0x00610074 1   0   1   Noise Word at   0    AT 
0x0074  2   0   1   Noise Word t    0    T 

này có nghĩa là tìm kiếm cho "AT&T" là khá nhiều chính xác giống như chỉ tìm kiếm "AT T".

Đây là thiết kế, theo như tôi có thể thấy cách duy nhất để sửa đổi hành vi này là cài đặt word breaker của riêng bạn, tuy nhiên đây không phải là điều tôi khuyên bạn nên làm.

2

Câu trả lời được chấp nhận không phải là hoàn toàn chính xác. Việc bao gồm cụm từ tìm kiếm trong dấu ngoặc kép làm cho việc nhóm các từ phù hợp với cụm từ "". Trong trường hợp này, ampsersand (&) có thể được coi là ký tự chữ, chẳng hạn như khi được bao quanh bởi một hoặc nhiều chữ cái không tạo thành từ đã biết. Chỉ cần nhìn vào "AT&T" ví dụ của bạn, chúng ta thấy:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"AT&T"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

Returns:

keyword    group phrase occurrence special  display expansion source 
        id  id     term   term  type  term 
0x0061007400260074 1  0  1   Exact Match at&t  0   AT&T 

Như bạn có thể thấy, dấu và trình bày không có vấn đề gì cả, miễn là nó được bao trong dấu nháy kép (") mà bạn đã và đang làm, hoo hoo!

Tuy nhiên, điều đó không làm việc như sạch cho "Johnson & Johnson" dụ:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"Johnson & Johnson"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

Returns:

keyword       group phrase occurrence special  display expansion source 
           id  id     term   term  type  term 
0x006A006F0068006E0073006F006E 1  0  1   Exact Match johnson 0   Johnson & Johnson 
0x006A006F0068006E0073006F006E 1  0  2   Exact Match johnson 0   Johnson & Johnson 

Đó dường như cũng để phù hợp với cụm từ tìm kiếm của Johnson Johnson, mà không phải là về mặt kỹ thuật chính xác.

Vì vậy, ngoài việc kèm theo trong dấu nháy kép, bạn cũng có thể chuyển đổi dấu và trở thành một dấu gạch dưới (_) được xử lý khác nhau:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"Johnson _ Johnson"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 
GO 

Returns:

keyword       group phrase occurrence special  display expansion source 
           id  id     term   term  type  term 
0x006A006F0068006E0073006F006E 1  0  1   Exact Match johnson 0   Johnson _ Johnson 
0x005F       1  0  2   Exact Match _  0   Johnson _ Johnson 
0x006A006F0068006E0073006F006E 1  0  3   Exact Match johnson 0   Johnson _ Johnson 

VÀ , làm một bản dịch ký tự đó dường như không ảnh hưởng bất lợi đến việc tìm kiếm "AT&T" gốc ban đầu:

DECLARE @Term NVARCHAR(100); 
SET @Term = N'"AT_T"'; 

SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, 0, 1); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 0); 
SELECT * FROM sys.dm_fts_parser(@Term, 1033, NULL, 1); 

Trả lại:

keyword    group phrase occurrence special  display expansion source 
        id  id     term   term  type  term 
0x00610074005F0074 1  0  1   Exact Match at_t  0   AT_T