Я обращаюсь к базе данных MarkLogic (v 8.0-3), используя структурированные запросы через API REST. Я не могу понять, как настроить индексы для выполнения «начинается с» запросов текстового поля. Так, например, если компания была названа «Sunday Sunshine Inc.», Я бы хотел найти его, ища начинается с «sund» (также содержит «sunshine»). Запрос типа - начинается с "suns" - должен не найти компанию.Как выполнить запрос «начинается с» с помощью MarkLogic cts: query()
Например, следующий «начинается с» запрос не должен найти документ, но он делает:
xquery version "1.0-ml";
xdmp:document-insert("/test/doc",<a>Sunday Sunshine Inc.</a>);
let $term := "suns"
return cts:search(fn:collection(),
cts:element-value-query(xs:QName("a"),$term || "* *",
("wildcarded","unstemmed","case-insensitive")),"unfiltered")
Я следующие индексы сконфигурированный:
- слово поиск
- позиции слов
- поиск быстрых фраз
- быстрый поиск с учетом регистра
- быстро диакритические чувствительные поиски
- быстрого элемент слова поиск
- элемент слово позиция
- быстрого элемент фразы поиска
- позиции значения элемента
- три символа поисковых запросы
- три позиции символа слова
- быстро поиск элементов символов
- trailing подстановочный поиск
Также следующий запрос получает правильные результаты (например, нет хитов):
xquery version "1.0-ml";
xdmp:document-insert("/test/doc",<a>Sunday Sunshine Inc.</a>);
let $term := "suns"
return cts:element-value-match(xs:QName("a"),$term || "*",
("case-insensitive"))
, но с использованием cts:element-value-match()
требует пользовательского ограничения запроса через интерфейс покоя, который я предпочел бы не делать. Но я думаю, что это странно cts:element-value-match()
, который нефильтрован, работает - поэтому индексы должны быть там, чтобы оценить запрос.
Любая помощь приветствуется.
Вы пробовали работать с 'filter' вместо' unfiltered'? Это должно помочь мне подумать. Если вы предпочитаете нефильтрованное, вы также можете использовать индекс диапазона и запрос диапазона элементов. Это не поддерживает подстановочные знаки, но вы также можете использовать gt/le типы операторов в строках. – grtjn
Спасибо за быстрый ответ. Мы бы предпочли использовать нефильтрованное - количество возможных ответов может быть большим (миллионы), и фильтрация может занять некоторое время. Мы обсудили использование индекса диапазона, но это последнее средство, я думаю. Мы можем получить верхний диапазон, добавив 1 к кодовому пункту, но мы должны учитывать диакритические элементы и случай - неважно, что у нас есть еще один индекс диапазона ... –
Вы должны иметь возможность работать с диакритикой и футляром с сопоставлениями. Посмотрите на построитель сопоставлений, который можно найти в пользовательском интерфейсе администратора при добавлении в базу данных любого индекса диапазона строк. – grtjn