2015-09-04 6 views
3

Я обращаюсь к базе данных 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(), который нефильтрован, работает - поэтому индексы должны быть там, чтобы оценить запрос.

Любая помощь приветствуется.

+0

Вы пробовали работать с 'filter' вместо' unfiltered'? Это должно помочь мне подумать. Если вы предпочитаете нефильтрованное, вы также можете использовать индекс диапазона и запрос диапазона элементов. Это не поддерживает подстановочные знаки, но вы также можете использовать gt/le типы операторов в строках. – grtjn

+0

Спасибо за быстрый ответ. Мы бы предпочли использовать нефильтрованное - количество возможных ответов может быть большим (миллионы), и фильтрация может занять некоторое время. Мы обсудили использование индекса диапазона, но это последнее средство, я думаю. Мы можем получить верхний диапазон, добавив 1 к кодовому пункту, но мы должны учитывать диакритические элементы и случай - неважно, что у нас есть еще один индекс диапазона ... –

+0

Вы должны иметь возможность работать с диакритикой и футляром с сопоставлениями. Посмотрите на построитель сопоставлений, который можно найти в пользовательском интерфейсе администратора при добавлении в базу данных любого индекса диапазона строк. – grtjn

ответ

3

Состоящий из вышеприведенных комментариев:

функции запроса, как cts:element-value-query рычагов так называемый универсальный индекс. Этот индекс по сути является словарным лексиконом, который поддерживает полнотекстовый поиск в MarkLogic. Чтобы искать значения, он сначала маркирует значение в словах, чтобы искать фрагменты, содержащие все необходимые слова.

Далее, если включено element word positions, оно может быть сохранено при фильтрации, проверяя порядок слов. По-видимому, фильтрация не полностью отменяется и по-прежнему необходима для фильтрации ложных срабатываний.

Функции, подобные cts:element-value-match, не используются вместе с cts:search или родственными. Более того, они требуют индекса диапазона, который можно прочитать в документации: http://docs.marklogic.com/cts:element-value-match

Поскольку эта функция соответствия зависит от индексов диапазона, она рассматривает только лексику значения индекса.Поскольку этот лексикон построен для этого конкретного элемента, а значения диапазона всегда сопоставляются от начала до конца строки, такой шаблон, как suns*, не будет возвращать ложные срабатывания. Индексы диапазонов также хранятся в памяти для быстрого доступа. Вот почему индексы диапазона эффективны и не требуют фильтрации. Они приходят за счет того, что занимают дисковое пространство и пространство памяти, и замедляют процесс глотания.

Примечание: сопоставления могут быть очень полезны для игнорирования таких вещей, как корпус, диакритика и белое пространство. Подробнее об этом можно узнать в руководстве по поиску. http://docs.marklogic.com/guide/search-dev/encodings_collations

Единственный недостаток в запросе диапазона заключается в том, что вы не можете выполнять подстановочный поиск по ним. Однако достаточно просто поместить вызов в одну из функций сопоставления значений внутри него, чтобы он возвращал все соответствующие значения и эффективно выполнял на них так называемый дробовик-ИЛИ. Вы также можете взять первый и последний из вызова с соотношением цены и использовать его для построения запроса диапазона >= AND <.

HTH!

Смежные вопросы