2009-02-25 9 views
13

SQL Server veritabanında bir Ürünler tablosu var ve Tam Metin dizini kullanan eski saklı yordamları gidermek zorundayım. Buradaki amaçlarımız için, Ürünler tablosunun iki alan kimliği olan Anahtar Kelimeler olduğunu varsayalım. Ve Sözcükler alanı aşağıdaki doldurulur:SQL Sorun: CONTAINS() kullanma çalışmıyor, ancak LIKE iyi çalışıyor

ROLAND SA-300 Bu Roland SA-300 MINT durumda olduğunu!

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*"') 

: Aşağıdaki ifadelerden herhangi çalıştırdığınızda

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

Ancak, sıfır sonuç almak: Aşağıdaki ifadeyi çalıştırdığınızda

, ben kayıt almak mümkün duyuyorum Ancak, CONTAINS() işlevinin çalıştığını biliyorum çünkü bunlardan herhangi birini çalıştırdığımda sonuç alırım:

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') 

CONTAINS() işlevinin neden 'SA-300' terimi üzerinde çalışmadığını anlamanız gerek. Tam metin dizinlerine yeniyim, bu yüzden herhangi bir yardım takdir edilir.

+2

Hiçbir ipucu yok, ancak endeksin güncel olduğunu kontrol ettiniz mi? – MichaelGG

cevap

13

İki düşünceler:

(1) tire bu dönüşü ne bir kelime mola olarak kabul edilebilir?

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

Bkz. Bu other question.

(2) Tam metin dizini yeniden oluşturmayı denediniz mi? Bu güncel değil mümkündür.

+0

# 2 doğruydu. Teşekkürler – jessegavin

-1

Eğer

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

Sana msdn üzerinde yapmaya çalışıyorsun dair bir örnek gördüm deneyebilir miyim.

+2

Sorusundan bunu denedi. – GregD

+0

Beyaz alanın önemli olup olmadığını bilmiyordum. Sanırım hayır. – ScArcher2

0

Gürültü sözcükler dosyanıza bir göz attınız mı? Benim makinede burada c bulunur: \ Program Files \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ FTData \ noiseENG.txt

Bunu test edebilir

bir yolu sadece tek bir boşluk ile belirli gürültü dosyasını düzenleyerek olduğunu böylece her şeyi dizine ekler ve sorgunuzu tekrar dener. Bunu test ortamında değil, üretimde "test ederim".

4

Tam metin dizinimi yeniden oluşturmam gerektiğini söndürüyor. Teşekkürler @MichaelGG ve @JohnFx

1

Ah! Teşekkür ederim @GregD. "Bu *" ya da "asla *" yi ararken "hiç bitmeyecek" dizesini bulamayan bir arama yaptık. 'un her ikisi de sözcüklerini noiseENG.txt adresindedir.

Bu dayanan bir sorgu başına bazında bu kapatmak mümkün benziyor, ama değildir: Ben

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

koştu ve sonuçları biz başlarken SQL 2008: Turn off Stop Words for Full Text Search Query

aranan.