Compartilhamento de tecnologia

Modelos de pesquisa do Elasticsearch: reutilizar e compartilhar consultas

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

No desenvolvimento e operação diários do Elasticsearch (ES), frequentemente encontramos cenários em que consultas semelhantes precisam ser executadas com frequência. Estas consultas podem envolver vários campos, condições de filtro e análise agregada devido à complexidade da lógica de negócios. Para otimizar essas operações e melhorar a eficiência do desenvolvimento, o Elasticsearch disponibiliza a função de templates de busca. Este artigo explica como usar os modelos de pesquisa do Elasticsearch para reutilizar e compartilhar consultas.

1. Por que usar modelos de pesquisa

No desenvolvimento diário, embora a maioria das consultas possa ser relativamente simples, em alguns cenários de negócios complexos (como finanças, medicina, etc.), uma pesquisa pode precisar passar ou retornar dezenas de campos e envolver condições de filtragem e análise de agregação complexas. . Neste ponto, escrever manualmente cada consulta não é apenas ineficiente, mas também sujeito a erros. Os modelos de pesquisa são como procedimentos armazenados ou funções no MySQL. Eles só precisam ser definidos uma vez, e a função de pesquisa pode ser concluída posteriormente no código chamando o modelo e passando parâmetros, o que melhora muito a eficiência do desenvolvimento e a flexibilidade da consulta.

2. Caso introdutório do modelo de pesquisa

2.1 Formulário padrão

A forma básica do modelo de pesquisa é definir um objeto JSON contendo condições de consulta e passar_search/template Chamadas de API. Por exemplo:

GET /index_name/_search/template
{
  "source": {
    "query": {
      "match": {
        "remark": "{{kw}}"
      }
    },
    "size": "{{size}}"
  },
  "params": {
    "kw": "真正的数值",
    "size": 100
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Neste exemplo,{{kw}}e{{size}}é uma variável no modelo, passadaparamsOs objetos passam valores específicos.

2.2 para formato JSON

toJSONA forma é caracterizada porsource Use strings para definir e caracteres de escape são obrigatórios. Por exemplo:

GET cars/_search/template
{
  "source": "{ "query": { "match": {{#toJson}}parameter{{/toJson}} }}",
  "params": {
    "parameter": {
      "remark": "真正的数值"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2.3 Passando parâmetros no método join

usarjoin O método pode concatenar os elementos do array em uma string para condições de consulta. Por exemplo:

GET index_name/_search/template
{
  "source": {
    "query": {
      "match": {
        "remark": "{{#join delimiter=' '}}kw{{/join delimiter=' '}}"
      }
    }
  },
  "params": {
    "kw": ["大众", "标致", "奔驰", "宝马"]
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.4 Formulário de valor padrão

Você pode definir valores padrão para parâmetros no modelo. Se o parâmetro não for passado na chamada, o valor padrão será usado. Por exemplo:

GET index_name/_search/template
{
  "source": {
    "query": {
      "range": {
        "price": {
          "gte": "{{start}}",
          "lte": "{{end}}{{^end}}200000{{/end}}"
        }
      }
    }
  },
  "params": {
    "start": 100000
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3. Memorize o modelo e implemente chamadas repetidas

3.1 Modelo de salvamento do Elasticsearch

Para reutilizar o template, podemos salvá-lo no Elasticsearch. Ao especificar o nome do modelo, é conveniente chamá-lo repetidamente mais tarde. Por exemplo:

POST _scripts/my_test_template
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "field_name": "{{kw}}"
        }
      }
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 Modelo de chamada

Ao chamar o modelo, passeid Para especificar um modelo específico e passar os parâmetros correspondentes. Por exemplo:

GET index_name/_search/template
{
  "id": "my_test_template",
  "params": {
    "kw": "自定义template的参数值"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.3 Consulte o modelo definido

As informações do modelo definido podem ser consultadas por meio de solicitações GET, por exemplo:

GET _scripts/my_test_template
  • 1

3.4 Excluir um modelo definido

Se precisar excluir um modelo definido, você pode usar uma solicitação DELETE, por exemplo:

DELETE _scripts/my_test_template
  • 1

4. Aplicação avançada de modelos de pesquisa

4.1 Modelo de verificação

Elasticsearch fornece_render/template API para validar o modelo.