AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

全文搜索 XML 属性

  • 772

我正在尝试确定是否可以使用全文搜索从存储在启用 FILESTREAM 的列中的 xml blob 中检索属性(属性)值。下面是一个示例,其中 message 是一个varbinary(max)存储 xml 消息的字段:

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

在 MSDN 页面Search Document Properties with Search Property Lists上,页面顶部的摘要包含以下声明:“另一方面,XML IFilter 不发出属性。”

我很困惑,因为这似乎适用于 XML 文档。我开始准备一个环境来测试,但我想先问一下,以防万一有人已经知道了。

full-text-search sql-server-2012
  • 1 1 个回答
  • 1235 Views

1 个回答

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

    如果您说的是 Word 或 Excel 文档,那么这些文档具有众所周知的属性,例如作者、标题、关键字等,您可以将这些属性与搜索属性列表和全文索引相关联。可用的属性取决于它们的 IFilter。您可以使用 PROPERTY 关键字来查询这些属性。

    但是对于 .xml 文件,文档不太可能具有这些自定义属性,而您真正想要做的是搜索 xml 内容。AccountNo 听起来只是 xml 中的一个属性,而不是文档属性。您可以使用普通的全文搜索方法搜索您的 xml,但是在全文索引中将忽略 xml 标记和属性名称。您可以查询属性和元素内容。您还可以将文件内容转换为 xml 并使用内置的 xml 方法,例如 .query、.nodes、.value 和 .exist。完成这个演示,看看它是否有意义:

    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
    

    我还进行了测试,但无法按照文档的建议让 xml 文档发出任何属性。然而,我可以让它与标准的 Word 文档一起使用。

    • 3

相关问题

  • 如何设置全文目录位置 SQL Server 2008/2012

  • 为什么 Denali 序列应该比标识列表现更好?

  • 如何使用全文搜索安装 SQL Server Express 2005

  • SQL Server 不应该支持范围吗?

  • 什么是 SQL Server“德纳利”?什么是新的?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve