Marklogic: запрос значения элемента против запроса диапазона пути - PullRequest
1 голос
/ 05 ноября 2019

Я занимался какой-то тренировкой, чтобы выяснить, какая производительность лучше для запроса значения элемента или запроса диапазона пути.

Я обнаружил, что поиск с помощью запроса диапазона пути немного медленнее, чем запрос значения элемента.

Кто-нибудь имеет представление о медлительности поиска с помощью запроса ранга пути, даже если он загружен дополнительным индексом диапазона пути.

Я использовал приведенный ниже код.

    xdmp:document-delete("/aname4.xml")
    xdmp:document-insert("/aname1.xml",
      <name><fname>John</fname><mname>Rob</mname><lname>Goldings</lname></name>),
    xdmp:document-insert("/aname2.xml",
      <name><fname>Jim</fname><mname>Ken</mname><lname>Kurla</lname></name>),
    xdmp:document-insert("/aname3.xml",
      <name><fname>Ooi</fname><mname>Ben</mname><lname>Fu</lname></name>),
    xdmp:document-insert("/aname4.xml",
      <name><fname>James</fname><mname>Rick</mname><lname>Tod</lname></name>)

    create path range index "/name/fname"

    checked response time with following search code

    cts:search(doc(),cts:path-range-query("/name/fname","=","Jim"),"filtered")

    cts:search(doc(),
      cts:element-value-query(xs:QName("fname"),"jim"),
    "filtered")

Есть ли конкретная вещь, которую я должен учитывать при использовании запроса диапазона пути

Любое предложение будет высоко оценено, поскольку оно поможет нам разработать эффективный код поиска.

1 Ответ

4 голосов
/ 05 ноября 2019

В отфильтрованном запросе каждый документ соответствия кандидата должен пройтись, чтобы проверить совпадения. Чтобы проверить соответствие диапазона элементов, нам просто нужно посмотреть имя элемента и затем его содержимое (если имена совпадают). Чтобы проверить соответствие диапазона пути, мы должны убедиться, что имя текущего элемента соответствует концу пути, а затем (в этом случае), что совпадает имя его родительского элемента, а затем этот родительский элемент находится в корне. Это не намного больше работы, но это больше работы. Аналогичным образом, для индексирования необходимо выполнить немного больше работы, чтобы узнать, какое содержимое элемента нужно индексировать.

Но вы также сравниваете яблоки с апельсинами по-другому: запрос значения не совпадает с запросом равенства диапазонапотому что запрос значения представляет собой полнотекстовый запрос - основанный и маркированный и, как правило, игнорирующий пробелы и знаки пунктуации - и запрос на равенство диапазонов представляет собой сравнение строк с использованием параметров сортировки. Для простого запроса значения большая часть работы может быть выполнена с помощью ключей, а не сравнения строк, но это сделает дополнительную работу с основами. С другой стороны, мы выполняем сравнения строк на стороне запроса диапазона, и для сопоставления без кодовой точки эти сравнения могут быть несколько сложными.

Если индекс диапазона пути будет выигрышным, если у вас есть документыс fname элементами, которые не находятся под name, поэтому их можно исключить с помощью разрешения индекса, и фильтру даже не нужно их учитывать.

Мой общий совет здесь: 1. Измерьте, потому что этоникогда не думайте о том, что вы думаете 2. Правило: выберите наименее ограничивающий индекс, который вам нужен, чтобы сделать различия, о которых вы заботитесь. то есть, если все ваши элементы fname всегда находятся под name, то не ставьте name на своем пути, потому что это просто добавляет работу. 3. Запросы значений - это просто запросы слов с добавленным ограничением «должен соответствовать всему экстенту элемента»;не думайте о них как о равенстве строк. Используйте индексы диапазонов для сравнения строк, но выберите наиболее скучную сортировку, которую вы можете использовать для своего случая использования.

...