#java #marklogic #marklogic-9 #marklogic-10
#java #marklogic #marklogic-9 #marklogic-10
Вопрос:
Я использую MarkLogic Java API для поиска документов JSON, хранящихся в коллекции MarkLogic 9. Мой JSON структурирован следующим образом
{
"time": "2021-02-09T11:09:53",
"payload": {
"a": "v1",
"b": "v2",
"c": [
{
"d": {
"a": "v1",
"b": "v2"
}
}
]
}
}
Я пытаюсь выполнить поиск /payload/a=v1 и /payload/b=v2, но поиск также возвращает все те документы, где /payload/c / d /a=v1 и /payload/c / d /b=v2
Вот мой Java-код
StructuredQueryBuilder sqb = queryManager.newStructuredQueryBuilder();
List<StructuredQueryDefinition> list = new ArrayList<>();
list.add(sqb.collection("collectionName"));
StructuredQueryDefinition a = sqb.value(sqb.jsonProperty("a"), "v1");
StructuredQueryDefinition b = sqb.value(sqb.jsonProperty("b"), "v2");
list.add(sqb.and(sqb.containerQuery(sqb.jsonProperty("payload"), sqb.and(a, b)))));
StructuredQueryDefinition definition = sqb.and(list.toArray(new StructuredQueryDefinition[list.size()]));
DocumentPage page = docManager.search(definition, 1L);
Любая помощь будет высоко оценена.
Спасибо, АК
Ответ №1:
Одним из подходов было бы использование TDE для проецирования payload/(a|b)
в двухколоночное представление.
Затем в Java API RowManager может сопоставлять документы по критериям для этих столбцов. Используйте joinDoc()
операцию для объединения и возврата полного содержимого документов.
Альтернативой может быть определение индекса диапазона путей on payload/a
, что устраняет ложные срабатывания under payload/c/d/a
. Проблема с индексами диапазона заключается в том, что они имеют большой вес (поскольку они сопоставлены с памятью, они используют ресурс независимо от того, используется он или нет) и предоставляют менее общее решение.
Надеюсь, это поможет,
Комментарии:
1. Этот xquery работает fn:collection(‘коллекция’)[полезная нагрузка / a =»v1″][полезная нагрузка / b = «v2»]. Есть ли способ преобразовать это в Java API.
2. Использование этих предикатов XPath в выражении с возможностью поиска требует фильтрации и, следовательно, не будет масштабироваться. Поисковая система должна извлекать каждый документ в коллекции, чтобы увидеть, соответствует ли XPath документу. Для индексированного решения используйте либо TDE, либо индекс диапазона путей.
3. Я новичок в MarkLogic, поэтому многого не знаю. Есть ли у вас какой-либо образец, на который я могу сослаться, поскольку я теряюсь, просматривая документацию. Спасибо
4. Хорошими отправными точками для TDE могут быть docs.marklogic.com/guide/sql/creating-template-views и docs.marklogic.com/guide/app-dev/TDE#id_54035 ; хорошей отправной точкой для индексов диапазона путей может быть docs.marklogic.com/guide/admin/range_index#id_40666
5. К сожалению, у меня есть привилегии только для чтения, поэтому я не могу создать какой-либо TDE. Есть ли другой способ.