Não é possível usar um predicado CONTAINS ou FREETEXT na tabela ou exibição indexada porque não é indexado por texto completo

95

Estou recebendo o seguinte erro em meu banco de dados SQL server 2008 R2:

Não é possível usar um predicado CONTAINSou FREETEXTna tabela ou exibição indexada 'tblArmy' porque não é indexado em texto completo.

DotnetSparrow
fonte
1
Você realmente criou um catálogo de texto completo?
Alex K.

Respostas:

111
  1. Certifique-se de ter o recurso de pesquisa de texto completo instalado.

    Configuração de pesquisa de texto completo

  2. Crie um catálogo de pesquisa de texto completo.

     use AdventureWorks
     create fulltext catalog FullTextCatalog as default
    
     select *
     from sys.fulltext_catalogs
  3. Crie um índice de pesquisa de texto completo.

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

    Antes de criar o índice, certifique-se:
    - você ainda não tem um índice de pesquisa de texto completo na tabela, pois apenas um índice de pesquisa de texto completo é permitido em uma tabela
    - existe um índice exclusivo na tabela. O índice deve ser baseado em coluna de chave única, que não permite NULL.
    - existe um catálogo de texto completo. Você deve especificar o nome do catálogo de texto completo explicitamente se não houver um catálogo de texto completo padrão.

Você pode executar as etapas 2 e 3 no SQL Server Management Studio. No explorador de objetos, clique com o botão direito do mouse em uma tabela, selecione o Full-Text indexitem de menu e o item de Define Full-Text Index...submenu. O assistente de indexação de texto completo irá guiá-lo através do processo. Ele também criará um catálogo de pesquisa de texto completo para você, caso ainda não tenha.

insira a descrição da imagem aqui

Você pode encontrar mais informações no MSDN

Alex Aza
fonte
Boas informações, Alex! NOTA: para aqueles que usam o Azure SQL, ele não oferece suporte para a Tabela Contém no momento. Veja aqui: msdn.microsoft.com/library/azure/ee336253.aspx
Termato
Além disso, se estiver usando o SQL Express Advanced Services, veja aqui para criar um Índice de Texto Completo: stackoverflow.com/questions/10407337/…
Termato
69

Uma solução alternativa para CONTAINS: se você não deseja criar um índice de texto completo na coluna e o desempenho não é uma de suas prioridades, você pode usar a LIKEinstrução que não precisa de nenhuma configuração anterior:

Exemplo: encontre todos os Produtos que contenham a letra Q:

SELECT ID, ProductName
FROM [ProductsDB].[dbo].[Products]
WHERE [ProductsDB].[dbo].[Products].ProductName LIKE '%Q%'
Mohammad Sepahvand
fonte
1
link . O predicado LIKE Transact-SQL funciona apenas em padrões de caracteres. Além disso, você não pode usar o predicado LIKE para consultar dados binários formatados. Além disso, uma consulta LIKE em uma grande quantidade de dados de texto não estruturados é muito mais lenta do que uma consulta de texto completo equivalente nos mesmos dados.
Manolis
1
Ah, legal ... a maneira fácil e circular que não requer que você desenterre seu instalador e vá mexer nas configurações do ambiente. Bem feito!
Christine
21

Você deve definir Full-Text-Indexem todas as tabelas do banco de dados onde deseja usar uma consulta CONTAINSque levará algum tempo.

Em vez disso, você pode usar o LIKEque fornecerá resultados instantâneos sem a necessidade de ajustar as configurações das tabelas.

Exemplo:

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

O mesmo resultado obtido com CONTAINSpode ser obtido com LIKE.

veja o resultado: insira a descrição da imagem aqui

Ashraf Abusada
fonte
Isso é muito inteligente
WonderWorker
6
Este é um bom truque, mas a forma como esta resposta foi formulada está errada. Não "apenas use". Existem algumas implicações de desempenho sérias para fazer isso e qualquer pessoa que coloque isso em um sistema de produção deve pensar com muito cuidado sobre fazer varreduras completas de tabela como essa em uma coluna não indexada.
caesay
3

Pode ser necessário habilitar a tabela para indexação de texto completo .

mellamokb
fonte
ativar / desativar a pesquisa de texto completo está desativado no menu de contexto. Acho que preciso instalar a pesquisa de texto completo. Como posso instalar a pesquisa de texto completo?
DotnetSparrow
Execute a instalação do SQL Server e deve haver uma opção para alterar os componentes instalados (ou algo semelhante). Clique nele e, em seguida, marque a caixa de seleção Texto Completo no momento apropriado e você deve estar pronto. Desculpe, não tenho um em mãos ou daria instruções mais específicas.
Tom H
@Hi Tom: Não vi a opção de adicionar recursos ao executar o instalador do SQL server 2008 R2.
DotnetSparrow
1

você tem que adicionar índice de texto completo em campos específicos que deseja pesquisar.

ALTER TABLE news ADD FULLTEXT(headline, story);

onde "notícias" é sua tabela e os campos "título, história" que você não habilitará para a pesquisa de texto completo

SimonQuest
fonte
1

Existe mais uma solução para definir a coluna Full text como true.

Essa solução, por exemplo, não funcionou para mim

ALTER TABLE news ADD FULLTEXT(headline, story);

Minha solução.

  1. Clique com o botão direito na mesa
  2. Projeto
  3. Clique com o botão direito na coluna que você deseja editar
  4. Índice de texto completo
  5. Adicionar
  6. Perto
  7. Atualizar

PRÓXIMOS PASSOS

  1. Clique com o botão direito na mesa
  2. Projeto
  3. Clique na coluna que deseja editar
  4. Na parte inferior do mssql você encontrará a guia "Propriedades da coluna"
  5. Especificação de texto completo -> (É indexado em texto completo) definido como verdadeiro.

Atualizar

Versão do mssql 2014

Chá gelado
fonte
-1
Select * from table
where CONTAINS([Column], '"A00*"')  

atuará como% igual a

where [Column] Like 'A00%'
Dnyanesh Mijagiri
fonte