2016-09-21 4 views
0

Я хочу искать документы в MarkLogic.MarkLogic - Поиск через Max/Min Filter

Мои документы выглядеть так:

<product xmlns="myns/products"> 
    <id>3114</id> 
    <materialNo xml:lang="en">1.1160</materialNo> 
    <steelName xml:lang="en">SWRCH24K</steelName> 
    <name xml:lang="en">wire, wire rod for cold heading</name> 
    <chemicalProperties> 
    <chemicalProperty> 
     <element>c</element> 
     <min>0.1900</min> 
     <max>0.2500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>si</element> 
     <min>0.1000</min> 
     <max>0.3500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>mn</element> 
     <min>1.3500</min> 
     <max>1.6500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>p</element> 
     <max>0.0300</max> 
    </chemicalProperty> 
    </chemicalProperties> 
</product> 

Так я хочу искать через макс/мин значений химических свойств. Для этого я использую этот поиск XQUERY (простой пример):

cts:search(/, cts:and-query(
    (cts:collection-query("test"), 
    cts:element-value-query(
    fn:QName("myns/products", "name"), 
    "wire, wire rod for cold heading"), 
    cts:element-query(
    fn:QName("myns/products", "chemicalProperty"), 
    cts:and-query(
     (cts:element-value-query(
      fn:QName("myns/products", "element"), "c"), 
     cts:or-query(
      (cts:element-range-query(
      fn:QName("myns/products", "max"), "<=", 0.2), 
      cts:and-not-query(
      cts:element-range-query(
       fn:QName("myns/products", "min"), "<=", 0.2), 
      cts:element-value-query(
       fn:QName("myns/products", "max"), "*")))), 
     cts:or-query(
      (cts:element-range-query(
      fn:QName("myns/products", "min"), ">=", 0.1), 
      cts:and-not-query(
      cts:element-range-query(
       fn:QName("myns/products", "max"), ">=", 0.1), 
      cts:element-value-query(
       fn:QName("myns/products", "min"), "*")))))))))) 

Проблема заключается в том, что запрос выше будет возвращать образец документа. Подпрограммы (и-not) проверяются, существует ли max/min. В некоторых случаях может быть только минимальное или максимальное значение.

Но этот документ за пределами ?!

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

В чем проблема? Какие-либо предложения.

UPDATE

Ок, спасибо за предложения, но нет. Включение позиции значения не решает проблему. Однако обходной путь заключается в удалении «и-не-запроса» и заменить его «и-запрос» и добавить новые атрибуты документов:

<chemicalProperty hasMin="0" hasMax="1">... 

индексирования и запросы этих атрибутов работает и возвращает правильное Результаты.

+0

Если у вас есть следующий вопрос, пожалуйста, разместите его как отдельный вопрос SO. Если этот вопрос уместен, вы можете связать его с новым. – wst

ответ

1

Вполне возможно, что из-за ваших настроек индекса, cts:element-query возвращает истину, если матч min и max запросы в любой<chemicalProperty> в том же документе, не ограничены одной <chemicalProperty>. Однако я бы ожидал увидеть это в нефильтрованном поиске, и я не вижу этого параметра в вашем вызове cts:search.

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

Альтернативным решением является использование cts:near-query для ограничения значений в запросе элемента по положению.

+1

Позиции должны решить эту проблему. cts: near-query тоже нуждается в них, или он будет эффективно вести себя как cts: and-query. По крайней мере, при запуске нефильтрованного. – grtjn

+0

@grtjn Я думаю, что 'cts: near-query' нуждается в разных позиционных индексах, чем' cts: element-query'? Но да, и я немного запутался в кажущемся отфильтрованном запросе в вопросе. Учитывая поведение, я думаю, что самым безопасным предположением на данный момент является то, что OP случайно отказался от примера. – wst

+0

Вы правы, 'cts: near-query' требует разных указателей положения. http://docs.marklogic.com/cts:near-query говорит: 'Индекс слова будет ускорять выполнение запросов, которые используют cts: near-query. Индекс позиции слова элемента будет ускорять производительность элементов-запросов, которые используют cts: near-query. ' – grtjn

0

Проблема заключается в том, что вы пытаетесь использовать подстановочные знаки в вызовах cts:element-value-query, но не объявляете их подстановочными. Поскольку ничто не будет соответствовать буквальному «*», cts:and-not-query делает противоположное тому, что вы намерены.

Вы хотите что-то вроде этого:

cts:element-value-query( fn:QName("myns/products", "max"), "*", "wildcarded")

cts:element-value-query

В качестве альтернативы, вы можете включить один из индексов подстановочных и ML обнаружит шаблонные запросы автоматически.

Если нет «подстановочных» или «неустановленных», конфигурация базы данных и $ text определяют подстановочные знаки. Если в базе данных активированы индексы подстановочных знаков («трехсимвольный поиск», «поиск по двум символам», «поиск одного символа» или «трейлинг-поиск подстановочных знаков»), и если текст $ содержит один из символов подстановки '?' или '*', он указывает «подстановочный знак». В противном случае указывается «неустановленная».

+0

Обычно нет необходимости объявлять параметр подстановки. Если какие-либо индексы подстановок включены, то подстановочная операция будет неявной, если в строке запроса присутствует подстановочный знак. – wst

+0

Я предположил, что «все остальные настройки по умолчанию» не были включены ни один из подстановочных индексов. – BenW

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