2015-02-02 2 views
0

Привет, эксперты MarkLogic,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 

Результаты должны быть: яблочный

пожалуйста, помогите некоторый образец запрос для вышеуказанных результатов, спасибо

С уважением,

DINESH

+0

Что вы уже пробовали? – grattmandu03

ответ

3

Если я понять ваши требования правильно, для одного оператора можно принять в качестве входных данных значения и оператор (хотя => из вашего примера должен быть >= в MarkLogic):

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))) 

Конечно, вам нужно будет создавать индексы индексов для этих значений атрибутов, или эти запросы будут вызывать исключение.

+2

Я обратился к чему-то подобному в нескольких блогах: http://developer.marklogic.com/blog/ranged-buckets; http://developer.marklogic.com/blog/ranged-buckets-udf. В первом посте описывается подход wst, который показан здесь. –

+0

Если у вас несколько узлов ввода в том же документе, то есть <ввод min = "10" max = "15" /><ввод min = "15" max = "20" /> вам нужно будет обернуть вышеуказанные и/или запросы в ближайшем запросе и включить параметр-значения-позиции для индексы на min и max, иначе вы можете получить ложные результаты, например, quering для min> = 10 max <= 20 вернет оба документа без ближайшего запроса – legspeleo

Смежные вопросы