На данный момент я использую этот код для создания фрагмента на основе документа 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
и
Чавес что-то сделал
Получит подсветку
Заранее спасибо!
<search:highlight>Chavez</search:highlight>
не является частью результата. Это вполне может быть ошибкой MarkLogic, поскольку, похоже, это противоречит тому, что можно было ожидать от этой функции. В качестве обходного пути вы можете подумать о написании функции, которая добавляет постпроцесс выделения, хотя это может быть нетривиальным (рассмотрите возможность использования NFD (декомпозиция), которая делает тривиальным удаление диакритических знаков как в поисковом запросе, так и в результате, а также поиск внутри результат с использованием обычных функций XPath / XQuery). - person Abel   schedule 08.09.2015Chavez
. Боюсь, что выполнение этого вручную может снизить производительность, но, возможно, я попробую создать некоторые функции, которые анализируют документы. Спасибо! - person Kamil Budziewski   schedule 08.09.2015