AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 177342
Accepted
Jefferson B. Elias
Jefferson B. Elias
Asked: 2017-06-27 21:42:48 +0800 CST2017-06-27 21:42:48 +0800 CST 2017-06-27 21:42:48 +0800 CST

Índice FullText na coluna VARBINARY: como encontrar string com ponto

  • 772

Em uma instância do servidor SQL Server 2012 SP3 CU8, temos arquivos PDF que foram inseridos em uma tabela chamada OBJECT_FILEcriada da seguinte forma:

CREATE TABLE [dbo].[OBJECT_FILE](
    [FILE_ID] [int] NOT NULL,
    [FILE_FIN] [int] NOT NULL,
    [OBJ_FILE_IDX_DOCTYPE] [varchar](3) NULL,
    [FILE_TYPE] [smallint] NOT NULL,
    [FILE_TXT] [varbinary](max) NULL,
    [FILE_TXT_SIZE] [int] NULL DEFAULT ((0)),
    CONSTRAINT [PK_DM_OBJECT_FILE] PRIMARY KEY CLUSTERED (
        [FILE_ID] ASC
    )
    WITH (
        PAD_INDEX = OFF, 
        STATISTICS_NORECOMPUTE = OFF, 
        IGNORE_DUP_KEY = OFF, 
        ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON
    ) ON [INDEXFG]
) ON [INDEXFG] TEXTIMAGE_ON [BLOBFG]

Também criamos um Índice FullText que é construído na FILE_TXTcoluna, que é um VARBINARY(MAX), criado da seguinte forma:

CREATE FULLTEXT INDEX 
ON OBJECT_FILE (
    FILE_TXT TYPE COLUMN OBJ_FILE_IDX_DOCTYPE
) 
KEY INDEX PK_DM_OBJECT_FILE 
WITH STOPLIST=OFF;

Nessa tabela, estamos dispostos a inserir o conteúdo de documentos antigos. Nestes conteúdos, encontraremos um identificador único inserido no passado que segue uma convenção de nomenclatura:

CORP-MMM-<three_digits_0_to_9>.<three_digits_0_to_9>

Quando tento fazer uma pesquisa usando a função interna CONTAINS em um identificador específico que sei que existe, ele não me retorna nenhum resultado. Eu uso a seguinte cláusula WHERE:

WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.245')

embora uma pesquisa com a seguinte cláusula WHERE me forneça vários resultados:

WHERE CONTAINS(FILE_TXT,'CORP-MMM-456.*')

e o registro em questão pode ser encontrado com LIKE:

WHERE FILE_TXT LIKE '%CORP-MMM-456.245%' 

Minha pergunta é:

Por que não consigo obter um registro específico sobre minha cláusula WHERE e como posso fazê-la funcionar?

sql-server sql-server-2012
  • 2 2 respostas
  • 2192 Views

2 respostas

  • Voted
  1. SqlWorldWide
    2017-06-28T05:21:50+08:002017-06-28T05:21:50+08:00

    Desculpe, isso pode não ser uma resposta, mas não posso colocar isso no comentário. Com base no comentário do OP @Jefferson (como resposta ao meu comentário), não consegui reproduzir o comportamento. Eu posso obter um registro de volta com a cláusula where que corresponde exatamente ao valor.

    Eu testei isso com o seguinte código (copiado e modificado daqui )

    CREATE TABLE Department 
       (DepartmentID INT IDENTITY CONSTRAINT DepartmentPK PRIMARY KEY, 
        NAME NVARCHAR(50),
        File_txt NVARCHAR(50));
    GO
    INSERT INTO Department (NAME, File_txt) VALUES ('OP1', 'CORP-MMM-456.245');
    INSERT INTO Department (NAME, File_txt) VALUES ('OP2', 'CORP-MMM-456.246');
    INSERT INTO Department (NAME, File_txt) VALUES ('OP3', 'CORP-MMM-456.247');
    INSERT INTO Department (NAME, File_txt) VALUES ('OP4', 'CORP-MMM-456.245.246');
    
    Go
    CREATE FULLTEXT CATALOG ComplexFTS AS DEFAULT;
    GO
    CREATE FULLTEXT INDEX ON Department(File_txt LANGUAGE 1033 /* 0 = Neutral, 1033 = American English  */)  
    KEY INDEX DepartmentPK WITH (STOPLIST = OFF); /* Or use (stoplist = Off) for no stoplist */
    GO
    WAITFOR DELAY '00:00:05';
    GO
    SELECT * FROM Department WHERE CONTAINS (File_txt,'"CORP-MMM-456.*"');
    SELECT * FROM Department  WHERE CONTAINS(File_txt,'CORP-MMM-456.245')
    GO
    

    Isso é o que recebo como meu conjunto de resultados.

    insira a descrição da imagem aqui

    Código de limpeza.

    DROP FULLTEXT INDEX ON Department;
    GO
    DROP FULLTEXT CATALOG ComplexFTS;
    GO
    DROP TABLE Department;
    GO
    
    • 1
  2. Best Answer
    Jefferson B. Elias
    2017-06-30T00:48:39+08:002017-06-30T00:48:39+08:00

    A solução consistiu na mudança do Índice de Texto Completo de inglês para idioma neutro.

    Isso pode ser explicado usando a seguinte sys.dm_fts_parserfunção interna do SQL Server.

    select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 1033, -- English NULL, 0 ) ;

    leva à exclusão do "." caractere em palavras-chave:

    Análise de String de Texto Completo com Language = English

    ao seguir o código, mantenha esse caractere disponível para pesquisas: select * from sys.dm_fts_parser( '" dsolkjfdskljfsd dfsd-MMM-236.127 dojfdslfkjds"', 0, -- Neutral NULL, 0 ) ; Resultados:

    Análise de string de texto completo com Language = Neutral

    Nós descartamos o índice existente e o criamos usando a LANGUAGE 0opção e isso resolveu nosso problema.

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve