Оригинальный запросчик упомянул, что контент находится в пределах 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 и передать их в запрос слова или значения.
Вы также можете жениться на этом подходе с лексикон на элементе и расширить термины только до тех, которые присутствуют в системе - и все же просто передать их как последовательность в поиск.