我从 cts:element-value-query 中得到了许多错误的搜索结果,其中包含 “未过滤”“空白敏感”“通配符”选项。 我想知道解释。 (过滤后的 CTS 搜索似乎工作正常。如果我删除“空白敏感”,它似乎可以工作)
这里是我要查找的目标元素值'ABC/DE 123/FG HI12'
xquery version "1.0-ml";
(:Case 1:)
let $term1 := 'ABC/DE 123'
(:Case 2:)
let $term2 := 'ABC/DE 123*'
(:Case 3:)
let $term3 := 'ABC/DE 123 *'
(:Case 4:)
let $term4 := 'ABC/DE 123* '
(:Case 5:)
let $term5 := 'ABC/DE 123* *'
let $queries := cts:and-query((cts:element-value-query(fn:QName("","name"), $term2, ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive", "wildcarded","lang=en"), 1), cts:collection-query("http://marklogic.com/collections/dls/latest-version")))
return
xdmp:plan(cts:search(fn:doc(), $queries, 'unfiltered'))
这是案例2和案例3的查询计划。 我的问题是为什么它们不同。
计划有所不同,因为通配符位于不同的位置,并且使用
cts:element-value-query
通配符匹配不会跨越单词边界。
ABC/DE 123*
,通配符用于以 123
开头的“单词”。ABC/DE 123 *
,它将查找 123
,然后 *
匹配其后面的所有内容。cts:element-value-query
中有一条关于通配符的注释解释:
- 请注意,
中值的文本内容与cts:element-value-query
中的短语相同,其中短语是元素值。因此,任何通配符和/或词干规则都被视为短语。例如,如果您的元素值为“hellofriend”并且为查询启用了通配符,则“he*”的cts:word-query
将不匹配,因为通配符匹配不跨越单词边界,而“he*”的cts:element-value-query
则不匹配。你好”将匹配。搜索“”将匹配,因为“*”通配符本身被定义为匹配该值。同样,词干规则应用于每个术语,因此当为查询启用词干提取时,搜索“hello Friends”将会匹配,因为“friends”与“friend”匹配。cts:element-value-query
此外,通配符搜索规则中的一些相关要点:
- 空格用作分词符,通配符匹配仅在单个单词内有效。例如,
将匹配m*th*
,但不匹配method
。meet there
- 如果使用非通配符指定
通配符,它将在值词典查询中匹配(例如,*
),但在值查询中不匹配(例如,cts:element-value-match
)。例如,cts:element-value-query
将匹配值词典搜索的值m*
(例如,meet me there
),但不会匹配值查询搜索的值(例如,cts:element-value-match
),因为值查询只匹配一个单词。对cts:element-value-query
的值搜索将匹配该值(因为m* *
匹配第一个单词,m*
匹配其后的所有内容)。*
- 如果查询具有
选项,则空格将被视为单词字符。这对于匹配通配符值查询中的空格非常有用。您也可以在通配符单词查询中使用whitespace-sensitive
选项,尽管它可能没有多大意义,因为它会比您预期的匹配更多。whitespace-sensitive