Search cts搜索返回通配符搜索的错误结果

Search cts搜索返回通配符搜索的错误结果,search,marklogic,Search,Marklogic,“未筛选”cts搜索查询的“通配符”搜索遇到问题 问题说明: 我已经在DB中插入了以下文档 xdmp:document-insert('/a/a1.xml', <root><aa>123</aa></root>); xdmp:document-insert('/a/a2.xml', <root><aa>12</aa></root>); xdmp:document-insert('/a/a3.xml',

“未筛选”cts搜索查询的“通配符”搜索遇到问题

问题说明: 我已经在DB中插入了以下文档

xdmp:document-insert('/a/a1.xml', <root><aa>123</aa></root>);
xdmp:document-insert('/a/a2.xml', <root><aa>12</aa></root>);
xdmp:document-insert('/a/a3.xml', <root><aa>1</aa></root>);
如果我将执行“过滤”搜索,我将得到正确的结果,即doc'/a/a3.xml

同样的问题是当搜索词为“?”(预期文档在“aa”元素中包含两位数)和 “???”(文档应包含“aa”元素中的三位数字)

以下索引设置为true:

  • 三字符搜索
  • 三字词位置
  • 快速元素字符搜索
  • 尾随通配符搜索
  • 尾随通配符字位置
  • 快速元素尾随通配符搜索

我很想知道为什么会发生这种情况,以及如何纠正这种情况?

如果有一个索引可以满足查询,则未经筛选的搜索只能返回准确的结果。您可以使用以下方法查看查询如何制定索引解析: <代码>xdmp:计划( cts:search(doc(),cts:element-word查询(xs:QName(“aa”),“?”,“通配符”)

在您的情况下,没有索引可以做到这一点,计划将显示您只是要求所有包含该元素的文档。只有在有三个或更多非通配符的情况下,三字符和尾随通配符索引才有效,而快速元素字符索引只意味着应用您拥有的任何字符索引使用元素上下文。我们建议您为通配符添加一个代码点排序规则单词词典。您可以将其作为一个整体添加到数据库中,或者,如果您知道此特定元素只需要这些类型的通配符,您可以添加一个元素单词词典。然后可以使用词典扩展来解析通配符


这是以一种启发式的方式自动发生的(也就是说,根据数据库的大小和词典匹配的数量,我们可能会以或多或少精确的方式来表达查询),但也有各种选项可以强制处理以某种方式进行。有关Mary的评论,请参见API的

——在您的示例中,我肯定倾向于通过元素词词典进行术语扩展。在很多情况下,我会选择此选项,而不是同时启用2字符和3字符通配符。关于这是一个很好的建议:如果您希望所有文档都包含一个元素,请使用cts:element查询(xs:QName('aa')、cts:and query(())。在MarkLogic 9中,您可以用可读性更高但等效的cts:true-query()替换cts:and query(())。
cts:search(
    doc(),
    cts:element-word-query(xs:QName('aa'), '?', ('wildcarded')),
    'unfiltered'
)