Nie można użyć predykatu CONTAINS lub FREETEXT w tabeli lub widoku indeksowanym, ponieważ nie jest on indeksowany pełnotekstowo

98

W mojej bazie danych SQL Server 2008 R2 pojawia się następujący błąd:

Nie można użyć predykatu CONTAINSlub FREETEXTw tabeli lub widoku indeksowanym „tblArmy”, ponieważ nie jest on indeksowany pełnotekstowo.

DotnetSparrow
źródło
1
Czy faktycznie utworzyłeś katalog pełnotekstowy?
Alex K.

Odpowiedzi:

113
  1. Upewnij się, że masz zainstalowaną funkcję wyszukiwania pełnotekstowego.

    Konfiguracja wyszukiwania pełnotekstowego

  2. Utwórz katalog wyszukiwania pełnotekstowego.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
    
  3. Utwórz indeks wyszukiwania pełnotekstowego.

     create fulltext index on Production.ProductDescription(Description)
     key index PK_ProductDescription_ProductDescriptionID
    

    Przed utworzeniem indeksu upewnij się, że:
    - nie masz jeszcze indeksu wyszukiwania pełnotekstowego w tabeli, ponieważ w tabeli jest dozwolony tylko jeden indeks wyszukiwania pełnotekstowego - w tabeli
    istnieje unikalny indeks. Indeks musi być oparty na kolumnie z jednym kluczem, która nie zezwala na wartość NULL.
    - istnieje katalog pełnotekstowy. Jeśli nie ma domyślnego katalogu pełnotekstowego, należy jawnie określić nazwę katalogu pełnotekstowego.

Możesz wykonać kroki 2 i 3 w SQL Sever Management Studio. W eksploratorze obiektów kliknij prawym przyciskiem myszy tabelę, wybierz Full-Text indexpozycję menu, a następnie Define Full-Text Index...pozycję podmenu. Kreator indeksowania pełnotekstowego poprowadzi Cię przez ten proces. Stworzy również dla Ciebie katalog wyszukiwania pełnotekstowego, jeśli jeszcze go nie masz.

wprowadź opis obrazu tutaj

Więcej informacji można znaleźć w witrynie MSDN

Alex Aza
źródło
Dobra informacja Alex! UWAGA: dla tych, którzy używają Azure SQL, nie obsługuje on obecnie tabeli Contains Table. Zobacz tutaj: msdn.microsoft.com/library/azure/ee336253.aspx
Termato
Ponadto, jeśli korzystasz z zaawansowanych usług SQL Express, zobacz tutaj, aby utworzyć indeks
pełnotekstowy
71

Obejście problemu CONTAINS: Jeśli nie chcesz tworzyć pełnotekstowego indeksu w kolumnie, a wydajność nie jest jednym z Twoich priorytetów, możesz użyć LIKEinstrukcji, która nie wymaga wcześniejszej konfiguracji:

Przykład: znajdź wszystkie produkty zawierające literę Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Mohammad Sepahvand
źródło
1
łącze . LIKE Predykat języka Transact-SQL działa tylko na wzorcach znakowych. Ponadto nie można używać predykatu LIKE do wykonywania zapytań dotyczących sformatowanych danych binarnych. Ponadto zapytanie LIKE dotyczące dużej ilości nieustrukturyzowanych danych tekstowych jest znacznie wolniejsze niż równoważne zapytanie pełnotekstowe dotyczące tych samych danych.
Manolis
3
Ach, kochanie ... łatwy, wszechstronny sposób, który nie wymaga od ciebie wykopywania instalatora i majstrowania przy ustawieniach środowiska. Dobra robota!
Christine,
21

Musisz zdefiniować Full-Text-Indexwe wszystkich tabelach w bazie danych, w których chcesz użyć zapytania, CONTAINSktóre zajmie trochę czasu.

Zamiast tego możesz użyć narzędzia, LIKEktóre zapewni natychmiastowe wyniki bez konieczności dostosowywania jakichkolwiek ustawień tabel.

Przykład:

SELECT * FROM ChartOfAccounts WHERE AccountName LIKE '%Tax%'

Ten sam wynik uzyskany CONTAINSza pomocą LIKE.

zobacz wynik: wprowadź opis obrazu tutaj

Ashraf Abusada
źródło
To naprawdę sprytne
WonderWorker
6
To fajna sztuczka, ale sposób sformułowania tej odpowiedzi jest zły. Nie używaj go po prostu. Ma to poważne konsekwencje dla wydajności i każdy, kto wprowadza to do systemu produkcyjnego, powinien bardzo uważnie przemyśleć wykonywanie pełnych skanów tabeli, takich jak ta, na nieindeksowanej kolumnie.
caesay
3

Może być konieczne włączenie w tabeli indeksowania pełnotekstowego .

mellamokb
źródło
włącz / wyłącz Wyszukiwanie pełnotekstowe jest wyszarzone w menu kontekstowym. Myślę, że muszę zainstalować wyszukiwanie pełnotekstowe. Jak mogę zainstalować wyszukiwanie pełnotekstowe?
DotnetSparrow
Uruchom instalację dla SQL Server i powinna istnieć opcja zmiany zainstalowanych komponentów (lub coś podobnego). Kliknij to, a następnie zaznacz pole wyboru Pełny tekst w odpowiednim momencie i powinieneś być dobry. Przepraszam, nie mam pod ręką lub podałbym bardziej szczegółowe instrukcje.
Tom H
@Hi Tom: Nie widziałem opcji dodawania funkcji, gdy uruchamiam instalator SQL Server 2008 R2.
DotnetSparrow
1

musisz dodać indeks pełnotekstowy do określonych pól, które chcesz przeszukać.

ALTER TABLE news ADD FULLTEXT(headline, story);

gdzie „wiadomości” to Twoja tabela, a pola „nagłówek, artykuł”, które chcesz włączyć do wyszukiwania pełnotekstowego

SimonQuest
źródło
1

Jest jeszcze jedno rozwiązanie, aby ustawić pełny tekst kolumny na wartość true.

Na przykład takie rozwiązanie nie zadziałało dla mnie

ALTER TABLE news ADD FULLTEXT(headline, story);

Moje rozwiązanie.

  1. Kliknij prawym przyciskiem myszy stół
  2. Projekt
  3. Kliknij prawym przyciskiem kolumnę, którą chcesz edytować
  4. Indeks pełnotekstowy
  5. Dodaj
  6. Blisko
  7. Odświeżać

NASTĘPNE KROKI

  1. Kliknij prawym przyciskiem myszy stół
  2. Projekt
  3. Kliknij kolumnę, którą chcesz edytować
  4. Na dole mssql znajdziesz zakładkę "Właściwości kolumny"
  5. Specyfikacja pełnego tekstu -> (Is Full-text Indexed) ustawiona na true.

Odświeżać

Wersja mssql 2014

Mrożona herbata
źródło
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

będzie działać w% tak samo jak

where [Column] Like 'A00%'
Dnyanesh Mijagiri
źródło