Мой запрос xpath не может использовать индекс диапазона. Что я делаю неправильно? - PullRequest
0 голосов
/ 20 мая 2019

Я нахожу связанный элемент по его идентификатору, сохраненному в href ссылочного элемента, например:

let $item := ($doc//(map|question|theory|reading|glossgroup))[@id = $ref/@href]

Читая документацию ExistDB, я почти уверен, что простого индекса <create qname="@ID" type="xs:string" /> должно быть достаточно, и, возможно, его даже нужно автоматически сгенерировать ... но, глядя на профилировщик, мой запрос не использует индексы.

Я даже пытался

let $item := $doc//map[@id = $ref/@href]

И создал индекс с полем id примерно так:

<index>
    <range>
        <create qname="map" type="xs:string">
            <field name="map-id" match="@id" type="xs:string" />
        </create>
    </range>
</index>

Но, похоже, ничего не работает.

Я довольно новичок в ExistDB ... возможно, делаю что-то явно не так, так что, если кто-нибудь может указать мне правильное направление :)?

Пример XML:

<root>
  <map id="ide931fee3-6a45-4435-a8d2-f018ae2ca2ea">
    <mapref href="f80cc8c8-6b6d-4005-b2e9-85eac2ee2fbf.1.36" />
  </map>
  <map id="f80cc8c8-6b6d-4005-b2e9-85eac2ee2fbf.1.36">
    <topicref href="47aed1dd-62f7-4fb6-ae76-dbfcde0a4bab.1.9" />
  </map>
  <question id="47aed1dd-62f7-4fb6-ae76-dbfcde0a4bab.1.9">
    ...
  </question>
</root>

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Если вы можете, я бы посоветовал переключиться на атрибут xml: id.Это индексируется автоматически с помощью существования-БД.Затем вы можете удалить определение индекса и использовать функцию id() для извлечения элементов.

Пример

$doc/id($ref/@href)

Использовать fn: id для поиска атрибутов xml: id

eXist-db автоматически индексирует все атрибуты xml: id и другие атрибуты с идентификатором типа, как объявлено в DTD (если проверка включена).Этот автоматический индекс используется стандартными функциями id и обеспечивает быстрый способ поиска элемента.Например, id("sect1")/head работает через быстрый поиск по индексу.

Однако эквивалентное выражение //section[@xml:id = 'sect1']/head не будет использовать индекс id.

Некоторые пользователи сообщают, что большие значения xml: idимеют отрицательное влияние на производительность.

источник

0 голосов
/ 20 июля 2019

Если вы все еще хотите придерживаться @id:

Создайте индекс диапазона с помощью: <create qname="@id" type="xs:string" /> (строчные буквы)

Это должно дать вам базовое использование индекса.

Перезапись вашего запроса может еще больше повысить производительность (полностью оптимизирована):

$doc//(map|question|theory|reading|glossgroup)/@id[. = $ref/@href]/..
...