Игнорируемые элементы XML отображаются рядом с результатами поиска eXist-db в lucene

Я создаю приложение с eXist-db, которое работает с файлами TEI и преобразует их в html.

Для функции поиска я настроил lucene, чтобы игнорировать некоторые теги.

<collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:teins="http://www.tei-c.org/ns/1.0">
    <index xmlns:xs="http://www.w3.org/2001/XMLSchema">

       <fulltext default="none" attributes="false"/>

        <lucene>
        <analyzer class="org.apache.lucene.analysis.standard.StandardAnalyzer"/>
        <analyzer id="ws" class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
            <text match="//teins:TEI">

                <inline qname="p"/>
                <inline qname="text"/>

                <ignore qname="teins:del"/>
                <ignore qname="teins:sic"/>
                <ignore qname="teins:index"/>
                <ignore qname="teins:term"/>
                <ignore qname="teins:note"/>

            </text>
        </lucene>


    </index>
</collection>

Что ж, это вроде работает, элементы отображаются не в результатах поиска напрямую, а в фрагментах до и после совпадающего текста, которые возвращаются модулем kwic. Есть ли способ удалить их или применить преобразование XSL перед индексированием?

пример TEI:

...daß er sie zu entwerten sucht. Wie 
                   <index>
                        <term>Liebe</term>
                        <index>
                            <term>und Hass</term>
                        </index>
                    </index>
Liebe Ausströmung inneren Wertes ist,... 

Когда я ищу "Ausströmung", результат запроса

 ....sucht. Wie Liebe und Hass Liebe    Ausströmung     inneren Wertes ist,...

Но должно привести к

 ....sucht. Wie Liebe   Ausströmung     inneren Wertes ist,...

Когда я ищу "Hass", этот фрагмент текста не отображается в результатах.

По функциям поиска: я строго придерживаюсь примера Шекспира в документации.


person romedius    schedule 18.01.2014    source источник


Ответы (1)


Возьмем отправную точку в приложении Shakespeare от eXist-db. Скажем, у вас есть там индексные записи. Вам не нужны совпадения в терминах индекса - об этом позаботится конфигурация индекса - но вы также не хотите, чтобы они выводились на дисплей KWIC - это вы должны кодировать самостоятельно.

Если вы посмотрите в app.xql, вы увидите, что есть функция с именем app: filter, вызываемая из app: show-hits. Это можно использовать для удаления частей вывода на дисплей KWIC на основе имени родительского элемента текстового узла, который выводится.

Это даст то, что вы хотите:

declare %private function app:filter($node as node(), $mode as xs:string) as xs:string? {
    let $ignored-elements := doc('/db/system/config/db/apps/shakespeare/collection.xconf')//*:ignore/@qname/string()
    let $ignored-elements := 
        for $ignored-element in $ignored-elements
        let $ignored-element := substring-after($ignored-element, ':')
        return $ignored-element
    return
        if (local-name($node/parent::*) = ('speaker', 'stage', 'head', $ignored-elements)) 
        then ()
        else 
            if ($mode eq 'before') 
            then concat($node, ' ')
            else concat(' ', $node)
};

Вы, конечно, можете жестко запрограммировать элементы, которые будут игнорироваться, как в ('speaker', 'stage', 'head', 'sic', 'term', 'note') ('index' здесь не нужен, так как вы всегда должны использовать 'term'), но я хотел показать, что это не обязательно. Однако, если вы не жестко запрограммируете игнорируемые элементы, вам непременно следует переместить назначение $ ignored-elements из функции, например, в переменную, объявленную в прологе запроса, чтобы база данных (collection.xconf) выполняла не вызывается для каждого текстового узла, с которым вы сталкиваетесь: это действительно глупо, но для простоты я поместил все в одну функцию.

PS: префиксы пространства имен могут быть любыми по вашему выбору, кроме стандартного префикса пространства имен для http://www.tei-c.org/ns/1.0 - это tei, и изменение его на teins может привести только к путанице.

person Jens Østergaard Petersen    schedule 18.01.2014
comment
Спасибо, это решило мою проблему. В настоящее время я работаю над установленным Verion с прошлого мая, поэтому функция фильтра выглядит немного иначе. И последнее: можно ли получить '/db/system/config/db/apps/shakespeare/collection.xconf' динамическим способом? Если я перенесу Приложение в другую папку, путь тоже изменится. Я изменил это на doc (fn: concat ('/ db / system / config', $ config: app-root, '/collection.xconf')), но это выглядит очень грязно и некрасиво. Есть ли лучшее решение для доступа к коллекциям, относящимся к корню приложения? - person romedius; 19.01.2014
comment
Если вы считаете это беспорядочным и уродливым, вам лучше начать к этому привыкать - так создается хорошее приложение. Я, например, считаю это красивым. - Не могли бы вы исправить «Игнорируемые атрибуты XML» в заголовке вопроса на «Игнорируемые XML-элементы»? - Вы объявляете и связываете $ ignored-elements в прологе запроса? - person Jens Østergaard Petersen; 19.01.2014