Запрос значения поля, возвращающий неожиданные результаты при использовании поиска "без фильтрации" в 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"
)
Нефильтрованный возвращает первый элемент во совпадающих фрагментах. Чтобы получить желаемый результат, вам нужно использовать отфильтрованные результаты или изменить модели данных или использовать корни фрагментов. Обратный порядок ваших элементов, и вы увидите - это всегда первый элемент в поисковом выражении, которое возвращается. Это природа фрагментов и отфильтрованных против нефильтрованных.