在 Windows 搜索中索引 PDF 文件时,我遇到了限制,特别是 System.Keywords 属性的数组大小。最多 20 个标签一切正常,但索引中不包含任何其他标签。
我的第一直觉是查看 IFilter 正在捕获什么,并使用 filtdump.exe 得到以下输出。
CHUNK: ---------------------------------------------------------------
Attribute = {F29F85E0-4FF9-1068-AB91-08002B27B3D9}\5 (System.Keywords)
idChunk = 3
BreakType = 0 (No Break)
Flags (chunkstate) = (Value)
Locale = 0 (0x0)
IdChunkSource = 0
cwcStartSource = 0
cwcLenSource = 0
VALUE: ---------------------------------------------------------------
Type = 31 (0x1f), VT_LPWSTR
Value = "TAG1; TAG2; TAG3; TAG4; TAG5; TAG6; TAG7; TAG8; TAG9; TAG10; TAG11; TAG12; TAG13; TAG14; TAG15; TAG16; TAG17; TAG18; TAG19; TAG20; TAG21"
所以我可以看到所有的标签都被检索到了,但最终的标签被截断了。
对 System.Keywords 的属性模式进行转储,我得到以下信息:
Property Key: {F29F85E0-4FF9-1068-AB91-08002B27B3D9} 5
Canonical Name: System.Keywords
Property Type: VT_VECTOR | VT_LPWSTR
Display Name: Tags
Edit Invitation: Add a tag
Type Flags: PDTF_MULTIPLEVALUES | PDTF_CANGROUPBY | PDTF_CANSTACKBY | PDTF_ISTREEPROPERTY | PDTF_ISVIEWABLE | PDTF_ISSYSTEMPROPERTY
View Flags:
Default Column Width: 11
Display Type: PDDT_STRING
Column State: SHCOLSTATE_TYPE_STR
Grouping Range: PDGR_DISCRETE
Relative Desc. Type: PDRDT_GENERAL
Sort Description: PDSD_A_Z
Sort Desc. Labels: A on top/Z on top
Aggregation Type: PDAT_UNION
Condition Type: PDCOT_STRING
Condition Operation: COP_WORD_EQUAL
Enumerated Types: 0
Search Info Flags: PDSIF_ININVERTEDINDEX | PDSIF_ISCOLUMN | PDSIF_ISCOLUMNSPARSE
Column Index Type: <not specified>
Projection String System.Keywords
Max Size: 512
还查看System.Keywords的文档,没有提到最大大小或项目限制。
再次查看文档,提到了 maxSize 属性:
可选的。指示存储在 Windows 搜索数据库中的属性值允许的最大大小。此限制适用于向量的各个元素,而不是整个向量。超出此大小的值将被截断。默认值为“128”(字节)。目前,Windows Search 在计算它从文件中接受的数据量时不使用 maxSize。相反,Windows Search 使用的限制是文件大小和从注册表中读取的 MaxGrowFactor(文件大小 N * MaxGrowFactor)的乘积,位于 HKEY_LOCAL_MACHINE->Software->Microsoft->Windows Search->Gathering Manager->MaxGrowFactor。默认 MaxGrowFactor 为四 (4)。因此,如果您的文件类型的总大小往往较小但具有较大的属性,Windows Search 可能不接受您要发出的所有属性数据。但是,您可以增加 MaxGrowFactor 以满足您的需要。
但是,我不清楚这是否会影响数组的大小。我猜这种截断发生在 Windows Search 的 Gatherer 组件中,所以我想知道是否涉及任何注册表设置。
FWIW 我确实使用ESE 数据库视图实用程序查看了 Windows 搜索数据库 (Windows.edb),我可以从架构中看到列类型是大型二进制类型,因此那里不应该有限制。查看原始值,我可以看到标记值的字节(由 NUL 字符分隔)并以 @ 字符结尾。但是只有 20 个值而不是 21 个确认限制。
我已经完成了我的研究,但我还没有走得更远。是否可以扩展 System.Keywords 的数组大小,还是 Gatherer 组件中的硬编码限制?任何帮助将不胜感激,在此先感谢!