IBM Cloud Docs
Trabalhando com o IBM Cloudant Query

Trabalhando com o IBM Cloudant Query

IBM® Cloudant® for IBM Cloud® Query é uma sintaxe declarativa de consulta JSON para bancos de dados IBM Cloudant. É possível usar um tipo de índice json ou text com IBM Cloudant.

Nos casos a seguir, é possível especificar como o índice é criado, tornando-o do tipo json:

  • Você sabe exatamente quais dados deseja procurar.
  • Você deseja manter os requisitos de armazenamento e processamento em um mínimo.

Mas, para obter flexibilidade máxima ao procurar dados, geralmente você cria um índice do tipo text. Os índices do tipo text têm um mecanismo simples para indexar automaticamente todos os campos nos documentos.

Embora mais flexíveis, os índices text podem demorar mais para serem criados e requerem mais recursos de armazenamento do que os índices json.

Criando um índice

É possível criar um índice com um dos tipos a seguir:

  • "type": "json"
  • "type": "text"

Criando um índice type=json

Para criar um índice JSON no banco de dados $DATABASE, faça uma solicitação POST para /$DATABASE/_index com um objeto JSON que descreve o índice no corpo da solicitação. O campo de type do objeto JSON deve ser configurado como json. Um índice JSON pode ser particionado ou global; essa opção é configurada usando o campo partitioned.

Veja o exemplo a seguir que usa HTTP para solicitar um índice do tipo JSON:

POST /$DATABASE/_index HTTP/1.1
Content-Type: application/json

Veja o exemplo a seguir de um objeto JSON que cria um índice particionado que é chamado foo-partitioned-index para o campo chamado foo:

{
    "index": {
        "fields": ["foo"]
    },
    "name" : "foo-partitioned-index",
    "type" : "json",
    "partitioned": true
}

Veja o exemplo a seguir de um objeto JSON que cria um índice global chamado bar-global-index para o campo chamado bar:

{
    "index": {
        "fields": ["bar"]
    },
    "name" : "bar-global-index",
    "type" : "json",
    "partitioned": false
}

Veja o exemplo a seguir de JSON retornado, confirmando que o índice foi criado:

{
    "result": "created"
}
Formato do corpo da solicitação
Campo Descrição
index campos - Uma matriz JSON de nomes de campo que usa a sintaxe de classificação. Os campos aninhados também são permitidos, por exemplo, person.name.
ddoc (opcional) Nome do documento de design no qual o índice é criado. Por padrão, cada índice é criado em seu próprio documento de design. Os índices podem ser agrupados em documentos de design para uma maior eficiência. No entanto, uma mudança para um índice em um documento de design invalida todos os outros índices no mesmo documento.
type (opcional) Pode ser json ou text. Padronizado para json.
name (opcional) Nome do índice. Se nenhum nome for fornecido, um nome será gerado automaticamente.
partitioned (opcional, booleano) Determina se esse índice é particionado. Para obter mais informações, consulte o campo partitioned.

O campo partitioned

Esse campo configura se o índice criado é particionado ou global.

Valores de campo particionados
Valor Descrição Notas
true Crie o índice como particionado. Pode ser usado apenas em um banco de dados particionado.
false Crie o índice como global. Pode ser usado em qualquer banco de dados.

O padrão segue a configuração partitioned para o banco de dados:

Valor particionado padrão
O banco de dados está particionado? Valor partitioned padrão Valores permitidos
True true true, false
Não false false

É importante reiterar que o valor padrão partitioned é true para índices que são criados em um banco de dados particionado. Esse valor padrão significa que o índice não pode ser usado para satisfazer consultas globais.

Códigos de Retorno
Código Descrição
200 O índice foi criado com sucesso ou existia no banco de dados.
400 Solicitação inválida - o corpo da solicitação não tem o formato especificado.

Criando um índice type=text

Quando você cria um índice de texto único, uma boa prática é usar os valores padrão, mas alguns atributos de índice úteis podem ser modificados.

Um índice text pode ser particionado ou global; essa opção é configurada usando o campo partitioned.

Para os índices de texto completo (FTIs), o type deve ser configurado como text.

Os atributos name e ddoc são para agrupar índices em documentos de design. Use os atributos para referir-se a grupos de índice usando um valor de sequência customizado. Se nenhum valor for fornecido para esses campos, eles serão preenchidos automaticamente com um valor de hash.

Se você criar vários índices de texto em um banco de dados, com o mesmo valor ddoc, será necessário saber pelo menos o valor ddoc e o valor name. A criação de diversos índices com o mesmo valor ddoc os coloca no mesmo documento de design. Geralmente, deve-se colocar cada índice de texto em seu próprio documento de design.

Para obter mais informações, consulte mais sobre text índices.

Veja o exemplo a seguir de um documento JSON que solicita uma criação de índice particionado:

{
    "index": {
        "fields": [
            {
                "name": "Movie_name",
                "type": "string"
            }
        ]
    },
    "name": "Movie_name-text",
    "type": "text",
    "partitioned": true
}

Veja o exemplo a seguir do documento JSON que solicita uma criação de índice global:

{
    "index": {
        "fields": [
            {
                "name": "Movie_name",
                "type": "string"
            }
        ]
    },
    "name": "Movie_name-text",
    "type": "text",
    "partitioned": false
}

Veja o exemplo a seguir de um documento JSON que solicita a criação de um índice particionado mais complexo:

{
    "type": "text",
    "name": "my-index",
    "ddoc": "my-index-design-doc",
    "index": {
        "default_field": {
            "enabled": true,
            "analyzer": "german"
        },
        "selector": {},
        "fields": [
            {"name": "married", "type": "boolean"},
            {"name": "lastname", "type": "string"},
            {"name": "year-of-birth", "type": "number"}
        ]
    },
    "partitioned": true
}

O campo index

O campo index contém configurações específicas para índices de texto.

Para indexar todos os campos em todos os documentos automaticamente, use a sintaxe simples:

"index": {}

O processo de indexação atravessa todos os campos em todos os documentos no banco de dados.

No banco de dados de demonstração dos filmes de exemplo, você pode ver um exemplo de um índice de texto que contém todos os campos e todos os documentos em um banco de dados.

Tome cuidado ao indexar todos os campos em todos os documentos para conjuntos de dados grandes, pois essa atividade pode consumir muitos recursos.

Veja o exemplo a seguir de um documento JSON que solicita a criação de um índice de todos os campos em todos os documentos:

{
	"type": "text",
	"index": { }
}

O campo default_field

O valor default_field especifica como o operador $text pode ser usado com o índice.

O default_field inclui duas chaves:

Chaves de campo Default_field
Chave Descrição
enabled Ative ou desative o default_field index. O valor padrão é true.

A chave analyzer no default_field especifica como o índice analisa o texto. Mais tarde, o índice pode ser consultado usando o operador $text. Para obter mais informações, consulte a Documentação de procura para analisadores alternativos. É possível escolher um analisador alternativo quando os documentos são indexados em idiomas diferentes do inglês ou quando você tem outros requisitos especiais para o analisador, como correspondência de endereços de e-mail.

Se o default_field não for especificado ou for fornecido com um objeto vazio, ele será padronizado como true e o analisador standard será usado.

A matriz fields

A matriz fields inclui uma lista de campos que devem ser indexados para cada documento. Esse campo poderá ser usado para limitar o tamanho do índice se você souber que ele consulta apenas campos específicos. Cada campo deve também especificar um tipo a ser indexado. Os tipos aceitáveis são mostrados na lista a seguir:

  • "boolean"
  • "string"
  • "number"

O campo index_array_lengths

Os índices de texto do IBM Cloudant Query têm uma propriedade que é chamada index_array_lengths. Se a propriedade não estiver configurada explicitamente, o valor padrão será true.

Se o campo for configurado como true, o índice requererá trabalho adicional. Esse trabalho contém uma varredura de cada documento para quaisquer matrizes, além de criar um campo para manter o comprimento para cada matriz localizada.

É possível configurar o campo index_array_lengths como false nas situações a seguir:

  • Não é preciso saber o comprimento de uma matriz.
  • Você não usa o operador $size.
  • Os documentos em seu banco de dados são complexos ou não estão completamente sob o seu controle. Como resultado, é difícil estimar o impacto do processamento adicional que é necessário para determinar e armazenar os tamanhos de matriz.

O operador $size requer que você defina o campo index_array_lengths como true. Caso contrário, o operador não pode funcionar.

Veja o documento JSON de exemplo a seguir com configurações sugeridas para otimizar o desempenho em sistemas de produção:

{
	"default_field": {
		"enabled": false
	},
	"index_array_lengths": false
}

O campo partitioned

Esse campo determina se o índice criado é um índice particionado ou global.

Valores de campo particionados
Valor Descrição Notas
true Crie o índice como particionado. Pode ser usado apenas em um banco de dados particionado.
false Crie o índice como global. Pode ser usado em qualquer banco de dados.

O padrão segue a configuração partitioned para o banco de dados:

Configurações particionadas para o banco de dados
O banco de dados está particionado? Valor partitioned padrão Valores permitidos
True true true, false
Não false false