Расширенная фильтрация документов MarkLogic с использованием операторов - PullRequest
0 голосов
/ 08 мая 2018

Мы разрабатываем корпоративное приложение, используя ML в качестве хранилища документов. Большое количество документов XML, связанных с бизнесом, хранится в ОД.

Чтобы реализовать бизнес-логику, нам нужен код для извлечения XML с применением фильтра к ним. Нравится: element_tag_1 = value1 && element_tag_2 > value2 || element_tag_3 = value2

Пример: emp_name = John && age > 40 || <available> != false

Здесь есть две части:

  1. Операторы "||" и "&&" для логической группировки
  2. Оператор>, <, = и! = Для сравнения </li>

В настоящее время мы используем приведенный ниже код для генерации запроса и его выполнения. ["Emp_name" и текст поиска "John" вставляются программно. Не показано в фрагменте ниже]

StringBuilder sb = new StringBuilder();
sb.append("<search:search xmlns:search=\"http://marklogic.com/appservices/search\">");
sb.append(" <search:query>");
sb.append("     <search:value-query>");
sb.append("         <search:element name=\"emp_name\"/>");
sb.append("         <search:text>John</search:text>");
sb.append("     </search:value-query>");
sb.append(" </search:query>");
sb.append(" <search:options>");
sb.append("     <search:sort-order type=\"xs:string\" collation=\"http://marklogic.com/collation/\" direction=\"descending\">");
sb.append("         <search:element name=\"filterName\"/>");
sb.append("     </search:sort-order>");
sb.append(" </search:options>");
sb.append("</search:search>");

QueryManager queryMgr = client.newQueryManager();
SearchHandle resultsHandle = new SearchHandle();
RawQueryDefinition query = queryMgr.newRawCombinedQueryDefinition(new StringHandle(sb.toString()));
query.setCollections(BaseDataConstants.FILTER_COLLECTIONS);
queryMgr.search(query, resultsHandle);

Является ли приведенный выше подход правильным?

Проблема 1: с помощью приведенного выше кода мы запрашиваем emp_name = John только для документа. Как мы можем иметь несколько значений-запросов с логической группировкой между ними, например: emp_name = John && age> 40

Проблема 2: В настоящее время мы делаем только сравнение, которое происходит по умолчанию. Как мы можем ввести здесь оператор для проверки>, <и! = В запросе значения. </strong>

1 Ответ

0 голосов
/ 10 мая 2018

Думаю, я бы использовал StructuredQueryBuilder здесь:

QueryManager queryMgr = client.newQueryManager();
StructuredQueryBuilder qb = new StructuredQueryBuilder(OPTIONS_NAME);
StructuredQueryDefinition querydef = 
  qb.and(
    qb.value("emp_name", "John"),
    qb.range("age", "xs:int", StructuredQueryBuilder.Operator.GT, 40)
  );
StringHandle searchHandle = 
  queryMgr.search(queryDef, new StringHandle()).get();
...