xquery - 如何使用 MarkLogic cts :query() 进行 "begins with"查询

标签 xquery marklogic

我正在通过 REST API 使用结构化查询访问 MarkLogic 数据库 (v 8.0-3)。我无法弄清楚如何配置索引以执行文本字段的“开始于”查询。例如,如果一家公司被命名为“Sunday Sunshine Inc.”。我希望能够通过搜索以“sund”(也包含“sunshine”)开头来找到它。类似以“suns”开头的查询应该找到公司。

例如,下面的“开头为”查询不应该找到文档,但它确实找到了:

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() 将需要通过其余接口(interface)进行自定义约束查询,而我不想这样做。但我认为未过滤的 cts:element-value-match() 很奇怪,但它起作用了 - 因此索引必须存在才能评估查询。

感谢任何帮助。

最佳答案

由以上评论组成:

查询函数如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。您还可以从值匹配调用中获取 first 和 last,并使用它来构建 >= AND <一种范围查询..

喂!

关于xquery - 如何使用 MarkLogic cts :query() 进行 "begins with"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401815/

相关文章:

xquery - Marklogic:使用xquery的字段范围查询和路径范围查询cts函数是什么

SPARQL 查询导致 XDMP-MEMCANCELED

java - 如何使用 MarkLogic Java API 调用路径范围索引查询?

gradle - 从 ml-gradle "provider"项目模式启用可重用的 gradle 任务?

xquery - 如何在Marklogic的Xquery中解析 ">"和 "<"?

hadoop - 马克逻辑 : Error while importing files using MLCP

sql-server - SQL Server 中的 XQuery 对零值执行 SUM

xml - XQuery 不同的 XML 标记

xml - xquery 按字母顺序按组名创建联系人列表

java - 我如何从java中的xquery获取json?