XQuery: поиск комбинации разных букв - PullRequest
1 голос
/ 10 января 2020

У меня следующая структура xml

<image>
    <id>88091942</id>
    <imageType>Primary</imageType>
    <format>pdf</format>
    <status timestamp="2019-11-20T12:20:02.616Z">Accepted</status>
    <size/>
    <languageCode>
        <val>eng</val>
    </languageCode>
    <comments/>
    <effectiveDate>2013-01-01T00:00:00.000Z</effectiveDate>
    <extractedText> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, ABCDE remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including B.C.D.E versions of Lorem Ipsum.</extractedText>
</image>

Я пытаюсь найти ABCDE в extractText . Текст должен быть найден в любом формате, например. BCDE, AB C .DE, Abcde, B. C .DE или любая комбинация. Если какая-либо из комбинаций присутствует, тогда результат должен возвращать текст, в противном случае пустая строка

Ниже приведен фрагмент кода, который я пытаюсь использовать: -

let $id := $image/cd:id/string()
let $text := $extractedText[contains(., "*ABCDE*&quot; OR &quot;*A.B.C.D.E.*&quot OR &quot;ABCDE01&quot;")]/string()
return fn:string-join(($id,$text),"!!!!")

Я получаю следующий результат -

88091942

где, как я должен получить -

88091942!!!!Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, ABCDE remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including B.C.D.E versions of Lorem Ipsum.

Любая помощь очень ценится.

Ответы [ 3 ]

2 голосов
/ 15 января 2020

Оригинальный запросчик упомянул, что контент находится в пределах MarkLogi c. Поэтому я дам ответ MarkLogi c -Centri c для вариантов использования на основе доступной информации. Настройка для полной реализации, включая чувствительность к регистру, может потребовать большего понимания основных особенностей MarkLogi c:

Case: "AB C", "AB D. C" et c Под капотом все содержимое проиндексировано. Индексы слов маркируют контент и применяют правила о чувствительности к регистру и диакритическом значении c при хранении контента. Границы слов основаны на разумном наборе значений по умолчанию, связанных с пробелами и знаками препинания. Это означает, что данные уже хорошо подготовлены для элементов с некоторым разделением символов. Мы можем видеть это, анализируя образец выше:

xdmp:describe(cts:tokenize("A.B D.C"))

Показывает, что пробелы игнорируются и пунктуация понимается на основе образца, результаты:

(cts:word("A"), cts:punctuation("."), cts:word("B"), ...)

Это означает, что нам нужно было бы просто еще принять во внимание отношение каждого слова друг к другу в тексте. Для этого мы гарантируем, что слова (A, B, C, D) находятся рядом друг с другом. Для этого настройка в базе данных под названием word positions может помочь в производительности. Для меня я оставил это для моего образца 300k документов. Тогда наш запрос так же прост:

cts:search(doc(), cts:near-query(cts:word-query(("A", "B", "C", "D")), 1))

Разбить его:

  • do c () - это простейшее выражение для поиска - для JS вы бы не иметь этого.
  • Затем мы запрашиваем слова для слов A, B, C, D. Внутренние рабочие короли cts:word-query() уже развернут это в список ор-запросов.
  • Все это ограничено положением - результаты запроса слова должны находиться в одной позиции друг от друга

MarkLogi c имеет множество функций. Для вышесказанного - где у меня были свободные пробелы и пунктуация, я просто использовал поиск слова функции OOTB.

Случай: «ABCD» Этот вариант использования полностью отличается и связан с полным словом. Я мог бы начать выполнять тяжелую работу с индексации системы до односимвольных символов. Это, вероятно, будет работать, но будет дорого. Вместо этого я думаю об этом по-другому. Образец выглядит как конечная комбинация. В этом случае самым быстрым решением, вероятно, было бы заранее рассчитать перестановки ABCD, ACBD и т. Д. c и передать их в запрос слова или значения.

Вы также можете жениться на этом подходе с лексикон на элементе и расширить термины только до тех, которые присутствуют в системе - и все же просто передать их как последовательность в поиск.

1 голос
/ 10 января 2020

contains(., "A OR B OR C") ищет буквенную строку «A ИЛИ B ИЛИ C».

Вы хотите contains(., "A") or contains(., "B") or contains(., "C").

В качестве альтернативы, вы можете переформулировать это как matches(., "A|B|C") .

Или, если строки связаны, например, ABCDE, AB C .DE, Abcde, AB C .DE, вы можете попробовать что-то вроде

contains(. => upper-case() => translate('.', ''), "ABCDE")
0 голосов
/ 11 января 2020

Ваши примеры не очень понятны, но похоже, что вы хотите этот тип RegExp в вашем XQuery:

let $id := /image/id
let $text := /image/extractedText[matches(.,'((a|A)\.)?(b|B)\.(c|C)\.(d|D)\.(e|E)')]
return fn:string-join(($id,$text),"!!!!")

Вывод:

88091942!!!! Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, ABCDE remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including B.C.D.E versions of Lorem Ipsum.

Тест в здесь

Если вы хотите спецификацию XPath / XQuery c RegExp, вы можете использовать флаги так же, как в matches(.,'(A\.)?B\.C\.D\.E', 'i') для игнорирования регистра.

...