Windows索引文件OLE DB搜索LIKE替换CONTAINS列不存在报错
问题背景
开发Windows索引文件OLE DB检索功能时,需要将查询语句中的CONTAINS谓词替换为LIKE谓词:使用CONTAINS搜索包含短横线的关键词(例如12-0430-1)时,分词器会自动按短横线拆分关键词,仅返回匹配12、0430或1的结果。该分词行为是微软官方文档明确说明的默认机制,官方给出的解决方案为将CONTAINS替换为LIKE谓词,但按方案修改查询后持续触发报错。
报错复现
报错提示为指定的列不存在,触发报错的查询语句:
SELECT TOP 2000 System.FileName FROM systemindex WHERE DIRECTORY = 'C:\Path...' AND (System.FullText Like ('%12-0430-1%')) ORDER BY System.DateCreated DESC
替换前可正常运行的CONTAINS版本查询:
正常运行的OLE-DB查询(搜索关键词
12-0430-1):SELECT TOP 2000 System.FileName FROM systemindex WHERE DIRECTORY = 'C:\Path' AND (CONTAINS ('"12-0430-1*"')) ORDER BY System.DateCreated DESC
本次检索使用的OLE DB连接配置代码:
OleDbConnection connection = new OleDbConnection("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';");
核心诉求
需实现文件已索引内容的检索,解决两个问题:
- 获取Windows索引文件搜索支持的最新可查询列清单的渠道
- 找到配合
LIKE谓词实现带短横线关键词精确匹配检索的有效列名
解决方案
最新可查询列清单获取方式
无需依赖滞后的公开文档,不同Windows版本的索引服务支持列存在小幅差异。在创建好有效的Search.CollatorDSO连接实例后,直接调用连接对象的GetSchema("Columns")方法,即可获取当前运行环境下所有支持查询的列的完整清单,返回结果包含列名、数据类型、支持的谓词类型等元数据,是最准确的参考依据。
LIKE匹配索引内容的正确列名
System.FullText是仅支持CONTAINS全文检索谓词的虚拟列,不支持LIKE匹配,这是触发列不存在报错的根本原因。
要对已索引的文件内容做LIKE模糊匹配,使用System.Search.Contents列即可。该列存储文件索引的原始文本内容,支持标准LIKE通配符匹配,匹配过程不会触发分词拆分,带短横线、特殊符号的关键词都可以实现精确子串匹配。
修正后的可正常运行的查询语句如下:
SELECT TOP 2000 System.FileName FROM systemindex WHERE DIRECTORY = 'C:\Path' AND System.Search.Contents LIKE '%12-0430-1%' ORDER BY System.DateCreated DESC
内容的提问来源于stack exchange,提问作者Brian Michelson

