怎么做"以"开头?使用MarkLogic cts进行查询:query()

时间:2015-09-04 15:38:01

标签: xquery marklogic

我正在通过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(),它是未经过滤的,可以工作 - 所以索引必须在那里来评估查询。

任何帮助表示感谢。

1 个答案:

答案 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!