我正在通过REST API使用结构化查询来访问MarkLogic数据库(v8.0-3)。我无法弄清楚如何配置索引以“开始”查询文本字段。例如,如果一家公司被命名为“Sunday Sunshine Inc.”我希望能够通过搜索以“sund”开始(也包含“阳光”)来找到它。类似的查询 - 以“suns”开头 - 应该而不是找到该公司。如何使用MarkLogic查询“开始”查询cts:query()
例如下面的“开始”查询应该找不到文档,但它的作用:
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()
需要通过REST接口,我宁愿不要做一个定制约束查询。但我觉得奇怪的cts:element-value-match()
,这是未经过滤的,工作 - 所以索引必须在那里评估查询。
任何帮助表示赞赏。
你是否试过用'filtered'而不是'unfiltered'运行?这应该有助于我的想法。如果您不想过滤,您还可以考虑使用范围索引和元素范围查询。这将不支持通配符,但您可以在字符串上使用gt/le类型的运算符。 – grtjn
感谢您的快速响应。我们真的更愿意使用未经过滤的 - 可能的响应数量可能很大(数百万),并且过滤可能需要一段时间。我们已经讨论过使用范围指数,但这是我认为的最后一招。我们可以通过在代码点上加1来得出上限范围,但我们必须考虑变音符和大小写 - 不必介意我们会添加另一个范围索引... –
您应该可以解决变音符号和大小写与排序。查看在将任何字符串范围索引添加到数据库时可以在管理界面中找到的排序规则构建器。 – grtjn