MarkLogic - Как использовать andNot в структурированном QueryBuilder

{"uuid": 121222151, "path": "/aaa/bbb/ccc.json", "name": "newDoc1", "uuid": 121222152, "path": "/aaa/ddd.json", " имя": "новыйДокумент1"}

Я использую StructuredQueryBuilder для поиска результатов.

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder();
StructuredQueryDefinition containPositiveQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("name"), queryBuilder.term("newDoc1"));
StructuredQueryDefinition containNegativeQuery = queryBuilder.containerQuery(queryBuilder.jsonProperty("path"), queryBuilder.term("*/bbb/*"));
StructuredQueryDefinition containQuery = qb.andNot(containPositiveQuery, containNegativeQuery);

Я хочу, чтобы в результате выполнялся поиск по имени «newDoc1», но не по пути, содержащему «*/bbb/*». Приведенный выше код не работает. Что может быть причиной?


person Aravind    schedule 03.06.2017    source источник


Ответы (2)


Ваш пример документа JSON плоский. Нет вложенных объектов. Поэтому нет контейнеров для запроса. Я предполагаю, что для достижения вашей цели ваш документ должен выглядеть примерно так:

{ "container": {
    "uuid": 121222151,
    "path": "/aaa/bbb/ccc.json", 
    "name": "newDoc1"
  },
  "container": {
    "uuid": 121222152,
    "path": "/aaa/ddd.json", 
    "name": "newDoc1"
  }
}

И ваш запрос больше похож на этот:

StructuredQueryBuilder queryBuilder = new StructuredQueryBuilder();
StructuredQueryDefinition positiveQuery = queryBuilder.term("newDoc1");
StructuredQueryDefinition negativeQuery = queryBuilder.term("*/bbb/*");
StructuredQueryDefinition containQuery = 
  queryBuilder.containerQuery(queryBuilder.jsonProperty("container"), 
    qb.andNot(positiveQuery, negativeQuery));

Я не могу проверить это полностью прямо сейчас, но, надеюсь, это направит вас в правильном направлении.

person Sam Mefford    schedule 05.06.2017

Вы включили подстановочные знаки для свойства пути? Если нет, вы, вероятно, захотите создать поле в свойстве пути и включить подстановочные индексы только для этого поля.

Чтобы понять поиск по подстановочным знакам, см.:

http://docs.marklogic.com/guide/search-dev/wildcard

Включение подстановочных знаков для определенного поля имеет смысл, если вам нужны подстановочные знаки только для этого свойства JSON.

person ehennum    schedule 05.06.2017