我们有两个包含以下元素的 XML 文档:
<!-- Document 1 -->
<LegacyCode>09Y14K012D3001</LegacyCode>
<!-- Document 2 -->
<LegacyCode>09 14 012 3001</LegacyCode>
我正在使用以下
cts:search
查询来获取这些文档:
cts:search(
doc(),
cts:and-query((
cts:collection-query("XYZ"),
cts:word-query("*09*14*012*3001*", ("punctuation-insensitive", "whitespace-insensitive", "wildcarded"))
))
)
但是,此查询不会返回预期的文档。有趣的是,如果我使用
"whitespace-sensitive"
选项,它会成功检索文档。
启用以下索引设置:
单词搜索
快速短语搜索
快速区分大小写的搜索
快速区分变音符号的搜索
尾随通配符搜索
尾随通配符单词位置
三字符搜索
三字词位置
两个字符搜索
单字符搜索
是什么导致了这种搜索行为?鉴于“空格”似乎在这里没有发挥任何作用,为什么
"whitespace-insensitive"
选项无法获取文档而 "whitespace-sensitive"
成功?
您的第二个文档
LegacyCode
元素具有 text()
值,该值将被标记并索引为多个“单词”,但第一个文档将有一个“单词”。
cts:word-query()
与 wildcard
和 whitespace-insensitive
可能不会做您想要/期望的事情。
空格用作分词符,通配符匹配仅在单个单词内有效。例如,
将匹配“method”,但不匹配“meet there”。m*th*
如果查询具有
选项,则空格将被视为单词字符。这对于匹配通配符值查询中的空格非常有用。您也可以在通配符单词查询中使用空格敏感选项,尽管它可能没有多大意义,因为它会比您预期的匹配更多。whitespace-sensitive
因此,如果您有通配符并且想要匹配单词查询中的多个“单词”,则需要使用
whitespace-sensitive
才能匹配两个文档。
如果您知道要定位
LegacyCode
元素,并且您要查找的值是该元素中的唯一文本,那么您可能需要查看 cts:element-value-query()
或 cts:field-value-query()
而不是 cts:word-query()
。