Category Archives: Motor de Busca

Elasticsearch

Criando Índice

$ wget http://media.sundog-soft.com/es7/shakes-mapping.json

$ curl -H 'Content-Type: application/json' -XPUT 127.0.0.1:9200/shakespeare --data-binary @shakes-mapping.json


$ wget http://media.sundog-soft.com/es7/shakespeare_7.0.json

$ curl -H 'Content-Type: application/json' -XPOST '127.0.0.1:9200/shakespeare/_bulk?pretty' --data-binary @shakespeare_7.0.json


$ curl -H 'Content-Type: application/json' -XGET
'127.0.0.1:9200/shakespeare/_search?pretty' -d '
{
   "query" : {
      "match_phrase" : {
         "text_entry" : "to be or not to be"
      }
  }
}'

 

Kinesis Streams

Introdução

O Amazon Kinesis Data Streams consome uma grande quantidade de dados em tempo real, armazena os dados de forma durável e os torna disponíveis para consumo. A unidade de dados armazenada pelo Kinesis Data Streams é um registro de dados. Um streamrepresenta uma sequência ordenada de registros de dados. Os registros de dados em um stream são distribuídas em shards (fragmentos).

Uma shard é um grupo de registros de dados em um stream. Quando você cria um stream, você especifica o número de shards desse stream. Cada shard pode suportar até 5 transações por segundo para leituras, até uma taxa total máxima de leitura de dados de 2 MB por segundo. Shards também suportam até 1.000 registros por segundo para gravações, até uma taxa total máxima de gravação de dados de 1 MB por segundo (inclusive chaves de partição). A capacidade total de um stream é a soma das capacidades de suas shards. Você pode aumentar ou diminuir o número de shards em um stream de acordo com a necessidade. No entanto, você é cobrado por shard (e muito bem cobrado).

Um produtor coloca registros de dados em shards e um consumidor obtém registros de dados a partir delas.

Como determinar o tamanho inicial do Kinesis Stream

Antes de criar um stream, você precisa determinar um tamanho inicial para ele. Depois de criá-lo, você pode aumentar ou diminuir dinamicamente a capacidade de seu shard usando o Console de gerenciamento da AWS ou a API UpdateShardCount. Você pode fazer atualizações enquanto houver umaAmazon Kinesis Data Streams application consumindo dados do stream.

Para determinar o tamanho inicial de um stream, você precisa dos seguintes valores de entrada:

  • O tamanho médio do registro de dados gravado no stream do em kilobytes (KB) arredondando para o próximo 1 KB, o tamanho dos dados (average_data_size_in_KB).
  • O número de registros de dados gravados e lidos no stream por segundo (records_per_second).
  • O número de Amazon Kinesis Data Streams applications que consomem dados simultânea e independentemente do stream, ou seja, os consumidores (number_of_consumers).
  • A largura de banda de gravação de entrada em KB (incoming_write_bandwidth_in_KB), que é igual a average_data_size_in_KBmultiplicado por records_per_second.
  • A largura de banda de leitura de saída em KB (outgoing_read_bandwidth_in_KB), que é igual a incoming_write_bandwidth_in_KBmultiplicado por number_of_consumers.

Você pode calcular o número inicial de shards (number_of_shards) que seu stream precisará usando os valores de entrada na seguinte fórmula:

number_of_shards = max(incoming_write_bandwidth_in_KB/1000, outgoing_read_bandwidth_in_KB/2000)

Criar um Stream

Você pode criar um stream usando o console do Kinesis Data Streams, a API do Kinesis Data Streams ou a AWS CLI.

Para criar um stream usando o console

  1. Abra o console do Kinesis Data Streams em https://console.aws.amazon.com/kinesis/.
  2. Na barra de navegação, expanda o seletor de região e escolha uma região.
  3. Selecione Create Stream.
  4. Na página Create Stream, insira um nome para o stream e o número de shards necessárias e, em seguida, clique em Criar.

    Na página Stream List, o Status de seu stream será CREATING enquanto ele estiver sendo criado. Quando o stream fica pronto para uso, o Status é alterado para ACTIVE.

  5. Escolha o nome do fluxo. A página Stream Details exibe um resumo da configuração do fluxo com informações de monitoramento.

Para criar um stream usando a API do Kinesis Data Streams

  • Para obter informações sobre a criação de um stream usando a API do Kinesis Data Streams, consulte Criar um stream.

Para criar um stream usando a AWS CLI

  • Para obter mais informações sobre a criação de um stream usando a AWS CLI, consulte o comando create-stream.

Atualizar um Stream

Você pode atualizar os detalhes de um stream usando o console do Kinesis Data Streams, a API do Kinesis Data Streams ou a AWS CLI.

nota

Você pode ativar a criptografia no lado do servidor para streams existentes ou para os recém-criados.

Para atualizar um stream usando o console

  1. Abra o console do Kinesis Data Streams em https://console.aws.amazon.com/kinesis/.
  2. Na barra de navegação, expanda o seletor de região e selecione uma região.
  3. Escolha o nome do fluxo. A página Stream Details exibe um resumo das informações de configuração e monitoramento do stream.
  4. Para editar o número de shards, selecione Editar na seção shards e, em seguida, insira uma nova shard.
  5. Para ativar a criptografia de registros de dados no lado do servidor, selecione Editar na seção de Criptografia no lado do servidor. Escolha uma chave do KMS para usar como chave mestra de criptografia, ou use a chave mestra padrão, aws/kinesis, gerenciada pelo Kinesis. Se você ativar a criptografia para um stream e usar sua própria chave mestra do KMS, seus aplicativos produtores e consumidores precisam ter acesso à chave mestra do KMS que você usou. Para atribuir permissões a um aplicativo para acessar uma chave do KMS gerado pelo usuário, consulte Permissões para usar as chaves mestras do KMS geradas pelo usuário
  6. Para editar o período de retenção de dados, selecione Editar na seção de Período de retenção de dados e, em seguida, insira um novo período de retenção de dados.
  7. Se você tiver ativado as métricas personalizadas na sua conta, selecione Editar na seção Métricas em nível de shard e, em seguida, especifique as métricas de seu stream. Para obter mais informações, consulte Monitorar o serviço do Amazon Kinesis Data Streams com o Amazon CloudWatch.

Atualizar um Stream usando a API

Para atualizar os detalhes do stream usando a API, consulte os seguintes métodos:

 

Elasticsearch – Guia de Introdução

Este texto tem como objetivo apresentar a solução Elasticsearch, um motor de busca capaz de manipular grandes quantidades de dados. Possui código-fonte aberto, sob licença da Apache.

Características

  • Open Source, baseado em Apache Lucene e Hadoop
  • Escrito em Java
  • Foco em escalabilidade – Comece pequeno e cresça
  • Pode utilizar dados de qualquer fonte, analisar e entregá-lo
  • Trabalha com JSON sob Http

Conceito

Como foi baseado no Lucene, herdou suas características:

  • Índice: define o endereço para acesso às informações guardadas no ES. De forma parecida com o esquema nos BDRs, necessitamos saber o nome e a localização na rede de um índice (por exemplo, localhost:9200/nome_indice) para conectar-se e manipular as estruturas de armazenamento do ES;
  • Type: recurso usado para nomear conjuntos de documentos armazenados em um índice, podendo ser comparado ao conceito de tabela em BDRs, pois contém vários documentos que obedecem a uma mesma estrutura de campos;
  • Documento: é um texto plano – isto é, não corresponde a formatos binários como .doc ou .pdf – organizado em campos delimitados por chaves e vírgulas, de acordo com o padrão JSON. Sua função é similar ao das linhas de tabelas, já que é sobre os documentos que as operações de manuseio de dados (inserção, recuperação, alteração e exclusão) são realizadas;
  • Campo (field): é a unidade mínima de informação armazenada em um documento. Deve possuir um tipo, que pode ser padrão – por exemplo: string, integer/long, float/double, boolean, ou null – ou criado pelo desenvolvedor. O campo tem a mesma função de uma coluna no BDR;
  • Mapeamento (mapping): define a estrutura de um documento, contendo campos e a maneira como cada um deve ser armazenado e recuperado. O mapeamento funciona como a definição de colunas nas tabelas em BDRs;
  • Query DSL: é a linguagem de busca (para mais detalhes, veja a seção Links). Está para o Lucene como o SQL está para os BDRs;
  • Score: valor numérico que representa quão bem um documento está relacionado a uma busca em Query DSL;
  • Analisador: mecanismo para transformação de texto – por exemplo: a conversão de letras maiúsculas em minúsculas, o tratamento de espaços em branco – durante o armazenamento e recuperação de informações.

Aguarde nova atualização.

Lucene – Exemplo de indexação e busca

Este exemplo aborda uma forma simples de indexação e busca de documentos utilizando a API do Apache Lucene, na sua atual versão 3.6. Ela pode ser baixada aqui e para utilizar em seu projeto, basta incluir a lib lucene-core-3.6.0.jar em seu classpath.

Criando o índice e definindo os termos dos documentos:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);

FSDirectory indexDir = FSDirectory.open(new File("/index"));
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);
IndexWriter iw = new IndexWriter(indexDir, iwc);

final String FIELD_LINK = "link";
final String FIELD_POST = "post";

Na primeira linha definimos qual será o analisador tanto para a indexação, quanto a que será utilizada no momento da busca. Neste caso utilizarei a Standard, mas já se tem disponível o analyzer em diversas linguagens e também pode-se criar um próprio, se necessário.

Após é feito a criação e abertura do índice. Neste caso, utilizando um índice gravado em disco através da classe FSDirectory. Dependendo da necessidade, pode-se usar a classe RAMDirectory para trabalhar com o índice todo somente em memória.

FIELD_LINK e FIELD_POST são os dois campos de exemplos deste índice, indicando o link de uma página e o seu conteúdo, respectivamente.

Inserindo um documento no índice:

Document doc1 = new Document();
doc1.add(new Field(FIELD_LINK, "http://www.coffeecode.com.br/?doc=1", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
doc1.add(new Field(FIELD_POST, "teste de busca em um texto livre", Field.Store.YES, Field.Index.ANALYZED));
iw.addDocument(doc1);

Document doc2 = new Document();
doc2.add(new Field(FIELD_LINK, "http://www.coffeecode.com.br/?doc=2", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
doc2.add(new Field(FIELD_POST, "outro texto para busca", Field.Store.YES, Field.Index.ANALYZED));
iw.addDocument(doc2);

iw.commit();

O Lucene trabalha com documentos, então cada entrada de dados será um documento com seus campos. Assim, instanciamos a classe Document e definimos quais serão seus campos, o valor, se este valor será recuperado ou apenas buscável e se ele deve passar pelo analisador.

Feito isto, os dois documentos já estão indexados e prontos para serem buscados. Sendo assim, partimos para a busca!

IndexReader ir = IndexReader.open(indexDir);
IndexSearcher is = new IndexSearcher(ir);

PhraseQuery pq = new PhraseQuery();
pq.add(new Term(FIELD_POST, "livre"));

TopDocs td = is.search(pq, 10);
for(ScoreDoc sdoc : td.scoreDocs) {
	Document d = is.doc(sdoc.doc);
	System.out.println("Link: "+d.get(FIELD_LINK));
	System.out.println("Post: "+d.get(FIELD_POST));
}

Com a classe IndexReader deixamos disponível o índice para leitura e utilizamos a IndexSearcher para passar a query e recuperar os documentos. Aqui podemos usar diversos tipos de implementações da classe Query, como a PhraseQuery, BooleanQuery, MultiPhraseQuery, TermQuery, entre outras.

A busca, neste caso, será pela palavra “livre” em cima do campo indexado post. Ela pode retornar um objeto TopDocs que contém os documentos que bateram com o termo buscado. A partir deles pode-se acessar diretamente o índice e retornar os campos desejados.