Entendendo a Elasticsearch Query DSL

Não apenas copiar-colagem do excesso de pilha mas compreender o que se está a copiar-colagem.

Elasticsearch é o motor de busca hoje em dia, mas a sua Query DSL tem uma curva de aprendizagem íngreme. Quando comecei a escrever as consultas Elasticsearch, consegui juntar algo que funcionava através de uma combinação dos documentos Elastic.co e Stack Overflow, mas não compreendi completamente os conceitos subjacentes à sintaxe.

Este tutorial pretende ser o que desejo ler pela primeira vez. Assume que o leitor está familiarizado com conceitos básicos de Elasticsearch, pode escrever consultas simples, e compreende a lógica booleana. O seu objectivo é fornecer ao leitor uma base conceptual firme de Elasticsearch antes de tentar compreender a sintaxe.

Filtragem de Valores Exactos vs Pesquisa Analisada de Texto Completo

Um tema abrangente em Elasticsearch é que todas as consultas podem ser classificadas em três tipos:

1. Filtragem por valores exactos
2. Pesquisa em texto analisado
3. Uma combinação dos dois

Todos os campos de documentos podem ser classificados como valores exactos ou texto analisado (também chamado texto completo). Os valores exactos são campos como user_iddateemail_addresses, etc. Texto analisado são dados de texto como product_description ou email_body. Como o nome implica, estes dados de texto foram analisados (mais sobre isto mais tarde). É frequentemente numa linguagem natural humana, mas não necessariamente.

P>Pergunição de documentos pode ser feita especificando filtros sobre valores exactos. Nestes casos, a questão de saber se o documento é devolvido é um sim ou não binário. Por exemplo, o documento é user_id igual a 174517 ? O documento é created_at data dentro do intervalo do último mês?

Por outro lado, a consulta de documentos através de pesquisa de texto analisado retorna resultados com base na relevância. Um documento é devolvido não por um critério de sim/não, mas sim pela sua relevância. Por exemplo, se o texto analisado de um documento incluir Johnny Depp, também deve ser devolvido em pesquisas por John Depp ou Johnnie Depp. Uma pesquisa por cozinheiro também deve retornar resultados para cozinhado e cozinhado.

Deste comportamento, podemos deduzir que a pesquisa por texto analisado é uma operação altamente complexa e envolve diferentes pacotes de analisadores, dependendo do tipo de dados de texto. Por exemplo, alguns pacotes de analisadores são linguagem específica que são utilizados na análise de texto em determinada linguagem. O pacote de analisador padrão é o analisador padrão que divide o texto por limites de palavras, minúsculas e remove a pontuação. Porque a pesquisa por texto analisado é muito mais complicada do que a filtragem por valores exactos, é muito menos eficaz do que a simples filtragem por valores exactos. Nota, chamaremos a pesquisa por texto analisado como pesquisa analisada para short.

A Consulta DSL

As consultas de pesquisa elástica são compostas de uma ou muitas cláusulas de consulta. As cláusulas de consulta podem ser combinadas para criar outras cláusulas de consulta, chamadas cláusulas de consulta composta. Todas as cláusulas de consulta têm um destes dois formatos:

{
QUERY_CLAUSE: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}{
QUERY_CLAUSE: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}

A regra da sintaxe é que as cláusulas de consulta podem ser repetidamente aninhadas dentro de outras cláusulas de consulta

{
QUERY_CLAUSE {
QUERY_CLAUSE: {
QUERY_CLAUSE: {
QUERY_CLAUSE: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
}
}

Aqui estão algumas cláusulas de consulta comuns.

Cláusula de consulta de correspondência

A cláusula de consulta de correspondência é a cláusula de consulta mais genérica e comummente utilizada. É bastante inteligente na medida em que, quando é executada num campo de texto analisado, efectua uma pesquisa analisada no texto. Quando é executado num campo de valor exacto, executa um filtro.

No exemplo abaixo, a primeira cláusula de consulta realizará uma pesquisa analisada uma vez que description é um campo de texto analisado. Enquanto que as 2 segundas consultas são filtros sobre campos de valores exactos.

{ "match": { "description": "Fourier analysis signals processing" }}
{ "match": { "date": "2014-09-01" }}
{ "match": { "visible": true }}

A Cláusula de Consulta Combinada

A cláusula de consulta combinada retorna todos os documentos. É análoga a SELECT * FROM table em SQL.

{ "match_all": {} }

Term Query Clause

As cláusulas de consulta de termos e termos são usadas para filtrar por campos de valores exactos por valores únicos ou múltiplos, respectivamente. No caso de valores múltiplos, a ligação lógica é OR .

Por exemplo, a primeira consulta encontra todos os documentos com a etiqueta “matemática”. A segunda consulta encontra todos os documentos com a etiqueta “matemática” ou “estatística”.

{ "term": { "tag": "math" }}
{ "terms": { "tag": }}

Multi Match Query Clause

A cláusula de consulta de correspondência múltipla é uma consulta de correspondência que é executada através de múltiplos campos em vez de apenas um.

{
"multi_match": {
"query": "probability theory",
"fields":
}
}

Cláusula de Consulta de Filtros e Filtros Ausentes

O filtro existente verifica se os documentos têm um valor num campo especificado. O filtro em falta verifica se os documentos não têm um valor num campo especificado. Eles são análogos às cláusulas IS NULL e IS NOT NULL do SQL.

{
"exists" : {
"field" : "title"
}
}

and

{
"missing" : {
"field" : "title"
}
}

Cláusula de consulta de filtro de intervalo

A cláusula de consulta de filtro de intervalo é utilizada para filtrar campos de número e data em intervalos, usando os operadores gtgteltlte abreviatura de greater_thangreater_than_or_equalless_than e less_than_or_equal , respectivamente.

{ "range" : { "age" : { "gt" : 30 } } }{ 
"range": {
"born" : {
"gte": "01/01/2012",
"lte": "2013",
"format": "dd/MM/yyyy||yyyy"
}
}
}

Bool Query Clause

A Cláusulas de consulta que são construídas a partir de outras cláusulas de consulta são chamadas cláusulas de consulta composta. Note-se que as cláusulas de consulta composta também podem ser compostas por outras cláusulas de consulta composta, permitindo o agrupamento de várias camadas.

A cláusula de consulta bool é um exemplo de cláusula de consulta composta, pois é utilizada para combinar várias cláusulas de consulta usando operadores booleanos. Os três operadores booleanos suportados são mustmust_not e should , que correspondem a ANDNOT , e OR , respectivamente.

Por exemplo, suponha-se que temos um índice no posts de um site de comunicação social popular. Aqui está uma consulta para encontrar todos os posts sobre matemática que não é provável, onde ou não é lida ou foi favorita.

{
"bool": {
"must": { "term": { "tag": "math" }},
"must_not": { "term": { "tag": "probability" }},
"should":
}
}

Combinando Pesquisa Analisada com Filtros

Temos falado de filtros de campo exactos e analisado a pesquisa em contextos separados, mas em aplicações do mundo real, queremos muitas vezes combinar os dois. Combinamos a pesquisa analisada e filtros de campo exactos usando a cláusula filtrada.

Por exemplo, suponha-se que temos um índice no posts de um popular fórum web sobre matemática. Aqui está uma consulta para encontrar todas as mensagens realizando uma pesquisa analisada por “Teoria da Probabilidade” mas só queremos posts com 20 ou mais upvotes e não aqueles com essa etiqueta “frequentista”.

{
"filtered": {
"query": { "match": { "body": "Probability Theory" }},
"filter": {
"bool": {
"must": {
"range": { "upvotes" : { "gt" : 20 } }
},
"must_not": { "term": { "tag": "frequentist" } }
}
}
}
}

Sumário

O pano de fundo conceptual da consulta Elasticsearch DSL é esta dicotomia de filtrar documentos vs pesquisar através de texto analisado. Espero que isto vos seja útil.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *