2009-02-25 39 views
13

Tôi có bảng Sản phẩm trong cơ sở dữ liệu SQL Server và tôi phải gỡ rối thủ tục được lưu trữ cũ sử dụng lập chỉ mục Toàn văn. Vì mục đích của chúng tôi ở đây, hãy giả sử rằng bảng Sản phẩm có hai ID trường, Từ khóa. Và trường Từ khóa được điền với các mục sau:Vấn đề SQL: Sử dụng CONTAINS() không hoạt động, nhưng LIKE hoạt động tốt

ROLAND SA-300 Roland SA-300 Đây là Roland-trong điều kiện MINT!

Khi tôi chạy các tuyên bố sau, tôi có thể lấy lại kỷ lục:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%' 

Tuy nhiên, khi tôi chạy bất kỳ những điều khoản sau đây tôi nhận được không có kết quả:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"') 

Nhưng tôi biết rằng hàm CONTAINS() đang hoạt động vì tôi nhận được kết quả khi tôi chạy bất kỳ kết quả nào sau đây:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland') 

Tôi cần tìm ra lý do tại sao hàm CONTAINS() không hoạt động trên thuật ngữ 'SA-300'. Tôi mới vào chỉ mục toàn văn, vì vậy mọi trợ giúp đều được đánh giá cao.

+2

Không có đầu mối, nhưng bạn đã kiểm tra xem chỉ mục hiện có chưa? – MichaelGG

Trả lời

13

Hai suy nghĩ:

(1) Dấu gạch ngang có thể được coi là một đột phá từ những trở làm gì?

SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300') 
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300') 

Xem này other question.

(2) Bạn đã thử xây dựng lại chỉ mục toàn văn chưa? Có thể nó đã lỗi thời.

+0

# 2 là chính xác. Cảm ơn – jessegavin

-1

Bạn có thể thử

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ') 

tôi thấy một ví dụ về những gì bạn đang cố gắng để làm trên msdn.

+2

Từ câu hỏi của anh, anh đã thử điều đó. – GregD

+0

Tôi không biết liệu không gian màu trắng có quan trọng không. Tôi đoán là không. – ScArcher2

0

Bạn đã xem tệp từ tiếng ồn của mình chưa? Trên máy tính của tôi, nó nằm ở đây c: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

Một cách mà bạn có thể kiểm tra điều này là bằng cách chỉnh sửa tập tin tiếng ồn cụ thể của bạn chỉ với một không gian duy nhất để nó lập chỉ mục mọi thứ và thử lại truy vấn của bạn. Tôi sẽ "thử nghiệm" điều này trong một môi trường thử nghiệm và không phải trong sản xuất.

4

Chỉ ra rằng tôi cần xây dựng lại chỉ mục toàn văn của mình. Cảm ơn các mẹo @MichaelGG và @JohnFx

1

Ah! Cảm ơn bạn @GregD. Chúng tôi đã tìm kiếm không tìm thấy chuỗi "điều này không bao giờ kết thúc" khi tìm kiếm "this *" hoặc "never *". Hóa ra cả hai từ đều có trong noiseENG.txt.

Nó không giống như nó có thể tắt chức năng này trên một cơ sở cho mỗi truy vấn, nhưng dựa trên này: SQL 2008: Turn off Stop Words for Full Text Search Query

Tôi chạy

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

và chúng tôi bắt đầu nhận được kết quả chúng tôi truy nã.

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