【问题标题】:MarkLogic Range QueryMarkLogic 范围查询
【发布时间】:2015-02-03 01:36:09
【问题描述】:

MarkLogic 专家您好,

您能否建议如何使用 MarkLogic 范围查询来实现以下示例结果。

XML

<entry min="100" max="999">
<product>apple</product>
</entry>
<entry min="1" max="99">
<product>orange</product>
</entry>
</root>

查询:

Query 1 : 200   > 

结果应该是:苹果

Query 2 : 200   <

结果应该是:苹果、橙子

Query 3 : 200 =>

结果应该是:苹果

Query 4 : 200 <=

结果应该是:苹果

Query 5 : 200 =

结果 4:苹果

Query 6 : 150 to 250

结果应该是:苹果

请帮忙查询一下上面的结果,谢谢

问候,

饭菜

【问题讨论】:

  • 你已经尝试了什么?

标签: marklogic range-query


【解决方案1】:

如果我正确理解您的要求,对于单个运算符,您可以接受值和运算符作为输入(尽管您示例中的 =&gt; 需要在 MarkLogic 中为 &gt;=):

let $value := 200
let $operator := ">"
return
  cts:search(doc()/entry,
    cts:or-query((
      cts:element-attribute-range-query(
        xs:QName("entry"), xs:QName("min"), $operator, $value),
      cts:element-attribute-range-query(
        xs:QName("entry"), xs:QName("max"), $operator, $value)))

对于一个范围:

let $begin := 150
let $end := 250
return 
  cts:search(doc()/entry,
    cts:and-query((
      cts:element-attribute-range-query(
        xs:QName("entry"), xs:QName("min"), ">=", $begin),
      cts:element-attribute-range-query(
        xs:QName("entry"), xs:QName("max"), "<=", $end)))

当然,您需要在这些属性值上建立范围索引,否则这些查询将引发异常。

【讨论】:

  • 我在几篇博文中谈到了类似的问题:developer.marklogic.com/blog/ranged-buckets; developer.marklogic.com/blog/ranged-buckets-udf。第一篇文章介绍了 wst 在这里展示的方法。
  • 如果您在同一个文档中有多个“条目”节点,即 你需要把上面的和/或在近查询中查询并为 min 和 max 上的索引启用 range-value-positions 选项,否则您可能会得到错误的结果,例如查询 min >=10 max
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 2012-01-09
相关资源
最近更新 更多