introduzir
À medida que os volumes de dados continuam a crescer, a pesquisa e a análise de conjuntos de dados em grande escala tornam-se cada vez mais importantes. Os bancos de dados tradicionais muitas vezes têm um desempenho ruim diante dessa demanda e neste momento é necessário um mecanismo especializado para busca e análise. ElasticSearch (abreviado ES) é um mecanismo de pesquisa tão poderoso com muitas vantagens que o tornam a primeira escolha de muitas empresas e desenvolvedores.
Simplificando: ElasticSearch
é um mecanismo distribuído de armazenamento , pesquisa e análise em tempo real .
Na minha opinião, o que há de mais forte no ES é, na verdade, sua função de pesquisa difusa.
Então algumas pessoas perguntarão: Meu banco de dados também pode implementar pesquisa difusa?
select * from student where name like '%宁正%'
Por exemplo, este sql pode encontrar alunos com a palavra Ning Zheng em seus nomes
. Na verdade, isso pode ser usado para pesquisa difusa, mas name like '%宁正%'
esta forma de escrita não é indexada, então significa: Se o seu volume de dados for muito grande, por exemplo , dezenas de milhões ou centenas de milhões de itens, não importa se você otimiza o código, sua consulta certamente ocorrerá em segundos.
E há outra situação. Quando pesquisamos na maioria das vezes, as informações inseridas não são muito precisas. Por exemplo, quero pesquisar ElasticSearch
informações relevantes, mas as digitei acidentalmente ElesticSearch
. Se você usar a instrução SQL para realizar uma pesquisa difusa , você não poderá pesquisar. Encontre informações relacionadas a es
Então pode ser usado nesta situação ElasticSearch
, é apenas para pesquisa.
Portanto, vou listar as vantagens do ES e fazer uma análise simples:
ES é muito bom em pesquisa difusa de texto completo
Motivo: o ES é baseado em índice invertido, o que permite que o ES corresponda palavras-chave rapidamente e retorne resultados relevantes sem a necessidade de varreduras completas da tabela, como nos bancos de dados tradicionais. Os índices invertidos são altamente eficientes ao armazenar e consultar dados de texto em grande escala.
Então alguns amigos podem perguntar depois de ler: Qual é o índice invertido? Qual é a diferença entre um índice invertido e um índice direto? Os índices invertidos podem ser usados nos bancos de dados que usamos todos os dias?
Então vamos responder um por um:
O que é um índice invertido?
O índice invertido é uma estrutura de índice baseada em palavras-chave comumente usada em mecanismos de pesquisa de texto completo e sistemas de recuperação de informações. É uma estrutura de dados que mapeia palavras-chave em um documento para IDs de documentos correspondentes.
Especificamente, o índice invertido mapeia cada palavra-chave do documento para o ID do documento que contém a palavra-chave. Para cada palavra-chave, o índice invertido registra a lista de documentos em que a palavra-chave aparece, incluindo frequência de palavras, localização e outras informações. Isso permite que uma determinada palavra-chave encontre rapidamente documentos relevantes que contenham essa palavra-chave.
Qual é a diferença entre índice invertido e índice direto?
Um índice direto é uma estrutura de índice classificada por ID de documento, que armazena informações detalhadas sobre documentos e cada entrada no documento.
Tenho uma maneira fácil de entender de expressar isso:
O índice direto é como o índice quando lemos um livro: podemos encontrar diretamente o conteúdo do número da página correspondente através do número da página.
O índice invertido extrai o vocabulário de todo o livro e registra em quais números de página o vocabulário existe para formar um relacionamento de mapeamento. Quando eu quiser descobrir em quais páginas um vocabulário aparece, só preciso usar esta tabela de mapeamento. Encontre rapidamente a página você quer
Com esta explicação, todos deveriam entender.
Os índices invertidos podem ser usados nos bancos de dados que usamos todos os dias?
Na verdade, o banco de dados pode suportar índice invertido, mas em comparação com o índice direto tradicional, a implementação do índice invertido do banco de dados é relativamente complicada, e o principal objetivo de design do banco de dados é apoiar o gerenciamento eficiente de dados e o processamento de transações, em vez de focar em requisitos de consulta complexos, como pesquisa de texto completo
A sintaxe de consulta do ES é mais flexível, permitindo controle preciso das condições e pesos da consulta, bem como pesquisas difusas mais complexas.
A sintaxe de consulta do Elasticsearch é bastante flexível e você pode controlar as condições e os pesos da consulta conforme necessário e realizar consultas complexas, como consultas booleanas, consultas de intervalo, consultas difusas e localizações geográficas. Usando a sintaxe de consulta, pesquisas mais precisas podem ser obtidas.
Estou escrevendo uma demonstração com base em minha própria consulta de localização geográfica.
geoDistanceQuery
É uma consulta de localização geográfica, utilizada para consultar documentos a uma certa distância de um determinado ponto de coordenadas geográficas. Basta fornecer as coordenadas de latitude e longitude de um ponto geográfico, uma distância e uma unidade:
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
GeoDistanceQueryBuilder geoQuery = QueryBuilders.geoDistanceQuery("local")
.point(lat, lon) // 地理位置坐标
.distance(distance, DistanceUnit.KILOMETERS); // 查询距离
sourceBuilder.query(geoQuery);
SearchRequest searchRequest = new SearchRequest("indexName");
searchRequest.source(sourceBuilder);
// 执行查询
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Na demonstração acima, criamos uma geoDistanceQuery
consulta para consultar documentos cujo campo de localização esteja a uma certa distância de uma determinada coordenada geográfica. A unidade usada aqui é quilômetros.
ES fornece funções ricas de agregação e análise
ES fornece nativamente funções ricas de agregação e análise, que podem realizar uma variedade de operações, como agregação , agrupamento e classificação de resultados . ES também fornece muitas outras funções de análise, como estatísticas de frequência de palavras , histogramas de data , etc. Esses recursos ajudam os usuários a compreender os dados mais profundamente e a gerar painéis e visualizações.
Também escreverei uma demonstração relativamente simples aqui, basta dar uma olhada e explicarei em detalhes em um blog posterior.
Suponha que temos um índice que armazena informações sobre filmes, incluindo os campos: título (título do filme), gênero (tipo de filme) e classificação (classificação do filme).
Agora, queremos agregar filmes de diferentes gêneros e calcular a classificação média de cada gênero.
Primeiro, precisamos construir uma consulta de agregação, especificar o agrupamento por campo de gênero e calcular a média de cada agrupamento.
GET movies/_search
{
"size": 0,
//指定聚合操作的容器
"aggs": {
//聚合操作起的一个名字
"genres": {
//指定分组字段的聚合操作类型
"terms": {
// 指定要分组的字段
"field": "genre"
},
"aggs": {
//平均值聚合操作起的一个名字
"avg_rating": {
//计算均值的聚合操作类型
"avg": {
//操作的字段
"field": "rating"
}
}
}
}
}
}
Na consulta acima, usamos terms
agregação para agrupar filmes por genre
campos e usamos avg
agregação para calcular a média de cada rating
campo agrupado.
Você obterá resultados semelhantes aos seguintes:
"aggregations" : {
"genres" : {
"buckets" : [
{
"key" : "Action",
"doc_count" : 100,
"avg_rating" : {
"value" : 4.2
}
},
{
"key" : "Drama",
"doc_count" : 80,
"avg_rating" : {
"value" : 3.8
}
},
...
]
}
}
Existem 100 filmes na categoria Ação com avaliação média de 4,2 e 80 filmes na categoria Drama com avaliação média de 3,8.
Este é apenas um exemplo simples de funções de agregação e análise. Na verdade, o ES fornece operações de agregação e funções de análise mais ricas, e operações mais complexas podem ser realizadas de acordo com necessidades específicas.
ES usa uma arquitetura distribuída para lidar melhor com dados em grande escala e consultas altamente simultâneas.
A arquitetura distribuída ES tem um bom desempenho na expansão horizontal. Ao fragmentar dados e armazená-los em vários nós, o ES pode processar dados em grande escala e melhorar o desempenho das consultas por meio de consultas paralelas e computação distribuída.
Não entrarei em detalhes aqui, mas irei apresentá-lo em detalhes mais tarde.
Então usamos ES sem cérebro ou precisamos fazê-lo em uma situação específica?
A resposta para a primeira pergunta é, claro, não dá para ir para o ES sem pensar!
- Embora ES seja poderoso, também é complexo. Usá-lo requer algum aprendizado e compreensão. Sem treinamento ou experiência adequada, você poderá encontrar erros de configuração, problemas de desempenho, erros de indexação e consulta e muito mais
- ES é um sistema distribuído que requer hardware apropriado e suporte de recursos para funcionar corretamente. A implantação inadequada pode levar a problemas de desempenho ou desperdício de recursos.
- ES requer gerenciamento e manutenção adequados, incluindo monitoramento da integridade do cluster, backup e restauração de dados, atualização e upgrade, etc. Se não for gerenciado e mantido adequadamente, você poderá enfrentar perda de dados, degradação de desempenho ou riscos de segurança
- custo! custo! Ou o custo!
A segunda questão é: quando devemos usar ES?
Na minha opinião, pode ser considerado das seguintes formas:
- Escala de dados. Se os dados que você deseja processar atingirem milhões ou mesmo centenas de milhões, você poderá usar o ES para processar grandes conjuntos de dados.
- Complexidade da pesquisa. Se você precisa realizar frequentemente consultas de texto complexas e preocupações em dados de texto completo, o ES é a melhor escolha.
- Em tempo real, se você precisar analisar dados em tempo real rapidamente, o ES é uma escolha adequada, pois suporta indexação e consulta de dados em tempo real e pode analisar e visualizar os dados imediatamente quando chegam.
- Requisitos distribuídos e de alta disponibilidade, se você precisa de uma solução de armazenamento e análise de dados escalável, de alta disponibilidade e tolerante a falhas, o ES é uma escolha adequada
Portanto, não use essa tecnologia descuidadamente só porque ela é poderosa. Ao usar a tecnologia, você também deve considerar os riscos que ela traz.