我正在通过REST API使用结构化查询访问MarkLogic数据库(v 8.0-3)。我无法弄清楚如何配置索引以"开始于"查询文本字段。例如,如果一家公司被命名为" Sunday Sunshine Inc."我希望能够通过以" sund"开头搜索来找到它。 (也包含"阳光")。类似的查询 - 以"太阳"开头 - 应该不找到公司。
例如以下"以"开头查询不应该找到文档,但确实如此:
xquery version "1.0-ml";
xdmp:document-insert("/test/doc",<a>Sunday Sunshine Inc.</a>);
let $term := "suns"
return cts:search(fn:collection(),
cts:element-value-query(xs:QName("a"),$term || "* *",
("wildcarded","unstemmed","case-insensitive")),"unfiltered")
我配置了以下索引:
以下查询也会得到正确的结果(例如没有命中):
xquery version "1.0-ml";
xdmp:document-insert("/test/doc",<a>Sunday Sunshine Inc.</a>);
let $term := "suns"
return cts:element-value-match(xs:QName("a"),$term || "*",
("case-insensitive"))
但使用cts:element-value-match()
需要通过其余界面进行自定义约束查询,而我不愿意这样做。但我觉得奇怪的是cts:element-value-match()
,它是未经过滤的,可以工作 - 所以索引必须在那里来评估查询。
任何帮助表示感谢。
答案 0 :(得分:3)
由上述评论组成:
像cts:element-value-query
这样的查询函数利用所谓的通用索引。该索引本质上是一个词汇词典,支持MarkLogic中的全文搜索。要搜索值,首先将值标记为“单词”以查找包含所有必需“单词”的片段。
接下来,如果已启用element word positions
,则可以通过检查“字词”的顺序来节省过滤。显然,过滤并未完全取消,仍然需要过滤掉误报。
cts:element-value-match
等功能不与cts:search
或相关的功能一起使用。此外,它们需要范围索引,可以在文档中阅读:http://docs.marklogic.com/cts:element-value-match
因为这些匹配函数依赖于范围索引,所以它只查看索引的值词典。由于该词典是为该特定元素构建的,并且范围值始终从字符串的开头到结尾匹配,因此像suns*
这样的模式不会返回误报。范围索引也保留在内存中以便快速访问。这就是范围索引有效的原因,不需要过滤。它们的确需要占用磁盘和内存空间,并减慢摄取速度。
注意:归类可能非常有用,可以忽略大小写,变音符号和空格。您可以在搜索开发指南中了解更多相关信息:http://docs.marklogic.com/guide/search-dev/encodings_collations
范围查询的唯一缺点是您无法对它们进行通配符搜索。但是,很容易调用其中的一个值匹配函数,使其返回所有相关值,并有效地对它们执行所谓的shotgun-OR。您还可以从值匹配调用中获取第一个和最后一个,并使用它来构造>= AND <
类型的范围查询。
HTH!