带或不带空白敏感度的 cts 搜索中的意外行为 - MarkLogic

问题描述 投票:0回答:1

我们有两个包含以下元素的 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"
成功?

marklogic cts-search marklogic-11
1个回答
0
投票

您的第二个文档

LegacyCode
元素具有
text()
值,该值将被标记并索引为多个“单词”,但第一个文档将有一个“单词”。

cts:word-query()
wildcard
whitespace-insensitive
可能不会做您想要/期望的事情。

通配符搜索规则

  • 空格用作分词符,通配符匹配仅在单个单词内有效。例如,

    m*th*
    将匹配“method”,但不匹配“meet there”。

  • 如果查询具有

    whitespace-sensitive
    选项,则空格将被视为单词字符。这对于匹配通配符值查询中的空格非常有用。您也可以在通配符单词查询中使用空格敏感选项,尽管它可能没有多大意义,因为它会比您预期的匹配更多。

因此,如果您有通配符并且想要匹配单词查询中的多个“单词”,则需要使用

whitespace-sensitive
才能匹配两个文档。

如果您知道要定位

LegacyCode
元素,并且您要查找的值是该元素中的唯一文本,那么您可能需要查看
cts:element-value-query()
cts:field-value-query()
而不是
cts:word-query()

© www.soinside.com 2019 - 2024. All rights reserved.