MarkLogic нечувствительный к диакритическим знакам фрагмент

На данный момент я использую этот код для создания фрагмента на основе документа JSON, который я получаю из поиска MarkLogic.

xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";

declare function searchlib:get-snippet($docc,$words) {
  let $doc:= json:transform-from-json($docc)
  let $squery := search:parse($words)
  let $result := <result>{search:snippet($doc,$squery,
  <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
          <max-snippet-chars>255</max-snippet-chars>

      </transform-results>)}</result>

  return $result//search:match
};

При поиске я использую:

cts.jsonPropertyValueQuery(fieldname, values, 
                                             ['case-insensitive', 'diacritic-insensitive'])

Таким образом, поиск работает без учета диакритических знаков и дает хорошие результаты, но в search:snippet я не могу передать параметр diacritic-insensitive, как в cts.jsonPropertyValueQuery.

В документации я вижу это в описании.

Параметры для определения грамматики поиска и управления поиском. Смотрите описание $ options для функции search: search. Обратите внимание, что вы не можете указать атрибут apply в параметре transform-results с помощью search: snippet; чтобы использовать другую функцию сниппета, используйте вместо нее search: search или search: resolve.

Но вот оно:

search:snippet(
   $result as node(),
   $cts-query as schema-element(cts:query),
   [$options as element(search:transform-results)?]
) as element(search:snippet)

Значит ли это, что я не могу передать другие параметры для search: snippet? Или есть возможность это сделать?

Я тестирую его с помощью chávez, и он дает результаты, но фрагменты создаются правильно только для документов, содержащих точное совпадение, что означает, что документ

Чавес что-то сделал

Не будет подсвечиваться на Chavez и

Чавес что-то сделал

Получит подсветку

Заранее спасибо!


person Kamil Budziewski    schedule 04.09.2015    source источник
comment
Я думаю, вы имеете в виду, что <search:highlight>Chavez</search:highlight> не является частью результата. Это вполне может быть ошибкой MarkLogic, поскольку, похоже, это противоречит тому, что можно было ожидать от этой функции. В качестве обходного пути вы можете подумать о написании функции, которая добавляет постпроцесс выделения, хотя это может быть нетривиальным (рассмотрите возможность использования NFD (декомпозиция), которая делает тривиальным удаление диакритических знаков как в поисковом запросе, так и в результате, а также поиск внутри результат с использованием обычных функций XPath / XQuery).   -  person Abel    schedule 08.09.2015
comment
@ Абель, да, это моя проблема. Я не выделил Chavez. Боюсь, что выполнение этого вручную может снизить производительность, но, возможно, я попробую создать некоторые функции, которые анализируют документы. Спасибо!   -  person Kamil Budziewski    schedule 08.09.2015
comment
Вам также следует подумать о том, чтобы сообщить MarkLogic, если это ошибка, возможно, у них уже есть обходной путь или даже патч.   -  person Abel    schedule 08.09.2015
comment
@Abel Я разместил тикет в MarkLogic :)   -  person Kamil Budziewski    schedule 10.09.2015
comment
Если они ответят либо обходным путем, либо решением проблемы, либо извинением, это не функция, которая будет рассматриваться, можете ли вы ответить с ее помощью на свой вопрос?   -  person Abel    schedule 10.09.2015
comment
@Abel Я отправлю ответ от MarkLogic   -  person Kamil Budziewski    schedule 10.09.2015
comment
@Abel получил ответ от MarkLogic, выложил его   -  person Kamil Budziewski    schedule 16.09.2015


Ответы (1)


Проблема заключалась в передаче параметров не search:snippet, а search:parse

xquery version "1.0-ml";
module namespace searchlib="http://ihs.com/lib/searchlib";
import module namespace search="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy"; 
import module namespace json="http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";

declare function searchlib:get-snippet($docc,$words) {
  let $doc:= json:transform-from-json($docc)
  let $squery := search:parse($words,
<options xmlns="http://marklogic.com/appservices/search">
<term>
<term-option>case-insensitive</term-option>
<term-option>diacritic-insensitive</term-option>
</term>
</options>, "cts:query")

  let $result := <result>{search:snippet($doc,$squery,
  <transform-results apply="snippet" xmlns="http://marklogic.com/appservices/search">
          <max-snippet-chars>255</max-snippet-chars>

      </transform-results>)}</result>

  return $result//search:match
};

прохождение

<term-option>diacritic-insensitive</term-option>

to search:parse заставил его работать.

Вот объяснение от MarkLogic:

Функция search:snippet() позволяет извлекать совпадающий текст и возвращает совпадения, заключенные в содержащий узел, с отмеченными выделениями. Однако, чтобы фрагмент search: snippet мог извлечь правильный текст, cts:query(), переданный фрагменту, должен соответствовать последовательности значений. Для search:snippet cts:query обычно является результатом вызова search:parse. Функция search:parse() анализирует текст запроса в соответствии с заданными параметрами и возвращает соответствующий cts:query XML.

person Kamil Budziewski    schedule 16.09.2015