Скажем, у меня есть JSON, сохраненный в ML8 как:

{
  "com.marklogic.poc.java.api.pojos.ProviderJSON": {
    "providerId": "1111",
    "name": "John Doe",
    "age": "41",
    "gender": "M"
  }
}

Я пробовал выполнять поиск, используя следующие методы для поиска всего json или любого конкретного атрибута:

  • срок
  • слово
  • значение

Но если я хочу узнать, присутствует ли «Joh» в свойстве name, я не могу использовать ничего из вышеперечисленного. Есть ли какой-либо доступный метод api, который можно использовать ..

2
Ankit Goel 25 Фев 2015 в 15:36

2 ответа

Лучший ответ

Я зашел на http: // localhost: 8001, выбрал «Документы» (база данных, связанная с OOTB с портом 8000) и изменил « трехзначный поиск от "до" истина ". Тогда у меня работает следующий код:

Test / ProviderJSON.java:

package test;

import com.marklogic.client.pojo.annotation.Id;

public class ProviderJSON {
    @Id
    public String providerId;
    public String name;
    public String age;
    public String gender;

    public String toString() {
        return
          "providerId:" + providerId + "\n" +
          "name:"       + name + "\n" +
          "age:"        + age + "\n" +
          "gender:"     + gender + "\n";
    }
}

И Test.java:

import test.ProviderJSON;

import com.marklogic.client.DatabaseClientFactory;
import static com.marklogic.client.DatabaseClientFactory.Authentication.DIGEST;
import com.marklogic.client.DatabaseClient;
import com.marklogic.client.pojo.PojoRepository;
import com.marklogic.client.pojo.PojoPage;
import com.marklogic.client.pojo.PojoQueryDefinition;

public class Test {
    public static void main(String[] args) {
        DatabaseClient client = 
            DatabaseClientFactory.newClient("localhost", 8000, "admin", "admin", DIGEST);

        PojoRepository<ProviderJSON, String> providers = 
            client.newPojoRepository(ProviderJSON.class, String.class);

        ProviderJSON provider1 = new ProviderJSON();
        provider1.providerId = "1111";
        provider1.name = "John Doe";
        provider1.age = "41";
        provider1.gender = "M";

        providers.write(provider1);

        PojoQueryDefinition query = client.newQueryManager()
            .newStringDefinition().withCriteria("Joh*");
        int start = 1;
        PojoPage<ProviderJSON> matches = providers.search(query, start);
        try {
            System.out.println("string matches.size() =[" + matches.size()  + "]");
            for ( ProviderJSON match : matches ) {
                System.out.println("string match.providerId =[" + match.providerId  + "]");
            }
        } finally { matches.close(); }

        query = providers.getQueryBuilder()
            .word("name", "Joh*");
        matches = providers.search(query, start);
        try {
            System.out.println("word matches.size() =[" + matches.size()  + "]");
            for ( ProviderJSON match : matches ) {
                System.out.println("word match.providerId =[" + match.providerId  + "]");
            }
        } finally { matches.close(); }

        query = providers.getQueryBuilder()
            .value("name", "Joh* *");
        matches = providers.search(query, start);
        try {
            System.out.println("value matches.size() =[" + matches.size()  + "]");
            for ( ProviderJSON match : matches ) {
                System.out.println("value match.providerId =[" + match.providerId  + "]");
            }
        } finally { matches.close(); }
    }
}

Обратите внимание, что для запроса значения требуется второй подстановочный знак для соответствия любым другим словам в значении.

Надеюсь, это поможет.

2
Sam Mefford 27 Фев 2015 в 17:07

Гоэль, вы можете использовать поиск слов с подстановочными знаками. Вам нужно будет включить одну из настроек подстановочных знаков для своей базы данных. Ниже приведен простой пример QBE. Я включил в своей базе данных "завершающий поиск с подстановочными знаками".

    DatabaseClient client = 
        DatabaseClientFactory.newClient(
            "localhost", 
            8000, 
            "admin", 
            "admin", 
            Authentication.DIGEST);

    QueryManager queryMgr = client.newQueryManager();

    StringHandle rawHandle = new StringHandle();
    String rawJSONQuery = 
            "{  \"$query\": { \"name\": { \"$word\": \"Joh*\" } }}";
    rawHandle.withFormat(Format.JSON).set(rawJSONQuery);

    RawQueryByExampleDefinition querydef =
            queryMgr.newRawQueryByExampleDefinition(rawHandle);

    SearchHandle resultsHandle = 
            queryMgr.search(querydef, new SearchHandle());

    client.release();
2
Dave Cassel 25 Фев 2015 в 14:21