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 / 47816
Accepted
Delux
Delux
Asked: 2013-08-09 10:44:18 +0800 CST2013-08-09 10:44:18 +0800 CST 2013-08-09 10:44:18 +0800 CST

Propriedades XML de pesquisa de texto completo

  • 772

Estou tentando determinar se posso recuperar um valor de propriedade (atributo) de um blob xml armazenado em uma coluna habilitada para FILESTREAM usando a pesquisa de texto completo. Aqui está um exemplo onde message é um varbinary(max)campo que armazena mensagens xml:

SELECT message FROM AuditTable
WHERE CONTAINS ( PROPERTY ( message, 'AccountNo' ), '123456');

Na página MSDN Pesquisar propriedades de documentos com listas de propriedades de pesquisa , o resumo na parte superior da página inclui esta declaração: "Por outro lado, o XML IFilter não emite propriedades."

Estou confuso porque parece que isso deve funcionar para um documento XML. Estou começando a preparar um ambiente para testar, mas queria perguntar primeiro caso alguém já saiba.

full-text-search sql-server-2012
  • 1 1 respostas
  • 1235 Views

1 respostas

  • Voted
  1. Best Answer
    wBob
    2013-08-09T16:50:35+08:002013-08-09T16:50:35+08:00

    Se você tiver, digamos, um documento do Word ou do Excel, eles terão propriedades conhecidas do documento , como Autor, Título, Palavras-chave, etc., que você pode associar a uma lista de propriedades de pesquisa e, em seguida, a um índice de texto completo. Propriedades disponíveis dependendo de seu IFilter. Você pode usar a palavra-chave PROPERTY para consultar essas propriedades.

    No entanto, com um arquivo .xml, é improvável que o documento tenha essas propriedades personalizadas e o que você realmente deseja fazer é pesquisar o conteúdo xml. AccountNo soa como apenas um atributo no xml em vez de uma propriedade de documento. Você pode pesquisar seu xml usando métodos comuns de pesquisa de texto completo; no entanto, a marcação xml e os nomes de atributos são ignorados em índices de texto completo. Você pode consultar o atributo e o conteúdo do elemento. Você também pode converter o conteúdo do arquivo para xml e usar os métodos xml integrados, por exemplo, .query, .nodes, .value e .exist. Trabalhe com esta demonstração e veja se faz sentido:

    USE master
    GO
    
    IF EXISTS ( SELECT * FROM sys.databases WHERE name = 'filestreamDemo' )
    BEGIN
        ALTER DATABASE filestreamDemo SET SINGLE_USER WITH ROLLBACK IMMEDIATE
        DROP DATABASE filestreamDemo
    END
    GO
    
    CREATE DATABASE filestreamDemo
    ON PRIMARY (name = filestreamDemo_File, filename = N'c:\temp\filestreamDemo.mdf' ),
    FILEGROUP FG_filestreamDemo CONTAINS FILESTREAM ( NAME = filestreamDemo_FS_File, FILENAME = N'c:\temp\filestreamDemo_FS' )
    WITH FILESTREAM ( 
        non_transacted_access = FULL,
        directory_name = N'filestreamDemo' )
    GO
    
    
    USE filestreamDemo
    GO
    
    -- DROP TABLE dbo.AuditTable
    IF OBJECT_ID('dbo.AuditTable') IS NULL 
    CREATE TABLE dbo.AuditTable
    (
        rowId           INT IDENTITY CONSTRAINT PK_AuditTable PRIMARY KEY,
        Id              UNIQUEIDENTIFIER ROWGUIDCOL NOT NULL UNIQUE,
        [message]       VARBINARY(MAX) FILESTREAM NULL,
        fileExt         VARCHAR(5) NOT NULL
    )
    GO
    
    IF NOT EXISTS ( SELECT * FROM sys.fulltext_catalogs WHERE name = N'ft' ) 
    CREATE FULLTEXT CATALOG ft AS DEFAULT
    GO
    
    CREATE FULLTEXT INDEX ON dbo.AuditTable
        ( [message] TYPE COLUMN fileExt )
        KEY INDEX PK_AuditTable ON ft
        WITH ( CHANGE_TRACKING = MANUAL, STOPLIST = SYSTEM )
    GO
    
    INSERT INTO dbo.AuditTable ( Id, [message], fileExt )
    SELECT
        NEWID(),
        CAST( '<root AccountNo="123456"/>' AS VARBINARY(MAX) ),
        'xml'
    
    UNION ALL
    
    SELECT
        NEWID(),
        CAST( '<root><child AccountNo="123456"/>elementValue</root>' AS VARBINARY(MAX) ),
        'xml'
    
    UNION ALL
    
    SELECT
        NEWID(),
        CAST( '<dummy/>' AS VARBINARY(MAX) ),
        'xml'
    GO
    
    
    ALTER FULLTEXT INDEX ON dbo.AuditTable START FULL POPULATION;
    GO
    
    SELECT 'before' ft, * FROM sys.fulltext_indexes
    GO
    
    DECLARE @i INT = 0
    
    WHILE EXISTS ( SELECT * FROM sys.fulltext_indexes WHERE has_crawl_completed = 0 )
    BEGIN
        WAITFOR DELAY '00:00:05'
    
        SET @i += 1
        IF @i > 60 BEGIN THROW 50001, 'Too many loops!', 1 BREAK END
    
    END
    GO
    
    SELECT 'after' ft, * FROM sys.fulltext_indexes
    GO
    
    
    -- Have a look in the full-text index
    SELECT *
    FROM sys.dm_fts_index_keywords_by_document(DB_ID(), OBJECT_ID('dbo.AuditTable'))
    ORDER BY document_id
    
    
    -- Search using full-text; WON'T WORK
    SELECT [message], CAST( [message] AS VARCHAR(MAX) ) 
    FROM AuditTable
    WHERE CONTAINS ( [message], 'AccountNo');
    
    
    -- will work
    SELECT [message], CAST( [message] AS VARCHAR(MAX) ) 
    FROM AuditTable
    WHERE CONTAINS ( [message], '123456');
    
    
    -- will work: numbers are prefixed with nn in full-text indexes
    SELECT [message], CAST( [message] AS VARCHAR(MAX) ) 
    FROM AuditTable
    WHERE CONTAINS ( [message], 'nn123456');
    
    
    -- Cast to xml and search using normal xml methods
    SELECT *
    FROM ( SELECT rowId, ID, CAST( [message] AS XML ) [message] FROM dbo.AuditTable ) a
    WHERE a.message.exist('//@AccountNo[.="123456"]') = 1
    GO
    

    Também fiz um teste e não consegui um documento xml para emitir nenhuma propriedade, conforme sugerido pela documentação. No entanto, eu poderia fazer isso funcionar com um documento padrão do Word.

    • 3

relate perguntas

  • Como definir a localização do catálogo de texto completo SQL Server 2008/2012

  • Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?

  • Como instalar o SQL Server Express 2005 com pesquisa de texto completo

  • O SQL Server não deveria oferecer suporte a RANGE?

  • O que é SQL Server "Denali"? O que há de novo?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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