Запрос значения поля, возвращающий неожиданные результаты при использовании поиска "без фильтрации" в MarkLogic

Я получаю ложные результаты с field-value-query при использовании с 'unfiltered' поиск.

Я объясню проблему с примерами данных, как указано ниже.

XML:

<book>
    <name>Dixit</name>
    <age>25</age>
    <entry>
        <isbn>
            <type>hbk</type>
            <value>1234567</value>
        </isbn>
        <isbn>
            <type>pbk</type>
            <value>111111</value>
        </isbn>
    </entry>
    <entry>
        <isbn>
            <type>hbk</type>
            <value>1234567</value>
        </isbn>
        <isbn>
            <type>pbk</type>
            <value>222222</value>
        </isbn>
    </entry>
</book>

Выше xml может иметь несколько <entry> элементы. Но два или более <entry> не может иметь то же самое <type>,

Я хочу, чтобы все записи имели комбинацию из одного или нескольких isbn тип, значения.

Как в приведенном выше примере. я хочу <entry> имея оба hbk:1234567 AND pbk:111111

Для достижения этого я бегу ниже cts:query

cts:search(
  fn:doc()/book//entry,
  cts:and-query((
    cts:field-value-query("hbk", "1234567", ("case-insensitive")),
    cts:field-value-query("pbk", "222222", ("case-insensitive"))
  )),
  "unfiltered"
)

Выход:

<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>111111</value>
    </isbn>
</entry>

По мне, вышеприведенный вывод неверен, так как должен возвращаться ниже <entry>,

<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>222222</value>
    </isbn>
</entry>

Даже если я запускаю запрос cts только с одним field-value-query как показано ниже, получая тот же результат (запись, имеющая значение pbk как 111111)

cts:search(
  fn:doc()/book//entry,
    cts:field-value-query("pbk", "222222", ("case-insensitive")),
  "unfiltered"
)

Поля, которые я создал:

pbk : /book/entry/isbn[./type = 'pbk']/value

hbk : /book/entry/isbn[./type = 'hbk']/value

Настройки индекса: (одинаковые для обоих полей)

введите описание изображения здесь

Примечание: для фильтрованного поиска это работает нормально.

Пожалуйста, помогите мне понять, почему это неожиданное поведение и что я могу сделать, чтобы исправить это.

Пытался:

cts:search(
  fn:doc()/book//entry,
  cts:element-query(
    fn:QName('','isbn'),
    cts:and-query((
      cts:field-value-query("hbk", "1234567", ("case-insensitive")),
      cts:field-value-query("pbk", "222222", ("case-insensitive"))
    ))
  ),
  "unfiltered"
)

2 ответа

Оберните ваш cts:and-query с помощью cts:element-query() вашего элемента isbn. Ниже приведено приблизительное значение того, что я имею в виду:

cts:search(
  fn:doc()/book//entry,
  cts:element-query(xs:QName("isbn"), 
      cts:and-query((
        cts:element-value-query(xs:QName("hbk"), "1234567", ("case-insensitive")),
        cts:element-value-query(xs:QName("pbk"), "222222", ("case-insensitive"))
      ))
   ),
  "unfiltered"
) 

Нефильтрованный возвращает первый элемент во совпадающих фрагментах. Чтобы получить желаемый результат, вам нужно использовать отфильтрованные результаты или изменить модели данных или использовать корни фрагментов. Обратный порядок ваших элементов, и вы увидите - это всегда первый элемент в поисковом выражении, которое возвращается. Это природа фрагментов и отфильтрованных против нефильтрованных.

Другие вопросы по тегам