MarkLogic Java API для поиска определенного пути в документе JSON

#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. Есть ли другой способ.