Как использовать cts: values ​​/ cts: element-attribute-values ​​с фильтрованным условием - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть два документа ниже, и индекс диапазона создается для элемента "Id", "Name", "Key" и "Value" типа данных string, string, string и integer соответственно.

<Root Id='1'>
 <Name>ABC</Name>
 <Child>
  <Key>1</Key>
  <Value>10</Value>
 </Child>
 <Child>
  <Key>2</Key>
  <Value>20</Value>
 </Child>
</Root>

<Root Id='2'>
 <Name>ABC</Name>
 <Child>
  <Key>1</Key>
  <Value>20</Value>
 </Child>
 <Child>
  <Key>2</Key>
  <Value>10</Value>
 </Child>
</Root>

Запрос ниже должен возвращать документ 1, но вместо этого он возвращает оба документа, потому что cts:element-attribute-values возвращает результат на основе "нефильтрованного".

cts:element-attribute-values(xs:QName("Root"),xs:QName("Id"), (), (),
cts:and-query((
    cts:element-value-query(xs:QName("Name"), "ABC"),
    cts:element-query(xs:QName("Child"),
        cts:and-query((
            cts:element-value-query(xs:QName("Key"), "1"),
            cts:element-range-query(xs:QName("Value"), "<", 15)
        ))
    )
))
)

Есть ли способ получить результат на основе фильтрации.

Примечание: я не хочу использовать cts: search (), так как мой запрос будет возвращать больше, чем100 000 записей

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

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

0 голосов
/ 06 декабря 2018

Документация cts:element-attribute-values для $query гласит:

Включать только значения во фрагменты, выбранные запросом cts:, и вычислять частоты из этого набора включенных значений.Значения не обязательно должны соответствовать запросу , но они должны присутствовать во фрагментах, выбранных запросом .Фрагменты не фильтруются, чтобы убедиться, что они соответствуют запросу, но вместо этого выбираются так же, как «нефильтрованные» операции cts: search.Если строка введена, строка обрабатывается как cts: word-query указанной строки.

Как вы уже заметили, ваш фильтр запросов не работает без фильтра, потому что он возвращает ложные срабатывания.cts:element-attribute-values также не имеет опции фильтрации.

Вы можете попробовать сделать следующее:

Создать корень фрагмента для Child.Это позволяет выполнить ваш запрос без фильтрации без возврата ложных срабатываний.

cts:element-attribute-values(xs:QName("Root"),xs:QName("Id"), (), (),
  cts:and-query((
      cts:element-value-query(xs:QName("Name"), "ABC"),
      cts:document-fragment-query(
        cts:element-query(xs:QName("Child"),
          cts:and-query((
              cts:element-value-query(xs:QName("Key"), "1"),
              cts:element-range-query(xs:QName("Value"), "<", 15)
          ))
       )
      )
    ))
)

Объяснение того, что я здесь сделал:

Путем создания корня фрагмента в Child каждый дочерний элемент сохраняется всобственный фрагмент.Таким образом, and-query для Key и Value возвращает только фрагменты, которые действительно содержат заданные значения.Создав document-fragment-query, вы проверите, содержит ли документ один из фрагментов (это необходимо, потому что поиск по фрагментам не работает).

Надеюсь, это поможет.

...