Berbagi teknologi

Templat pencarian Elasticsearch: gunakan kembali dan bagikan kueri

2024-07-12

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

Dalam pengembangan dan pengoperasian Elasticsearch (ES) sehari-hari, kita sering menjumpai skenario di mana kueri serupa perlu sering dieksekusi. Kueri ini mungkin melibatkan beberapa bidang, kondisi filter, dan analisis agregat karena kompleksitas logika bisnis. Untuk mengoptimalkan operasi ini dan meningkatkan efisiensi pengembangan, Elasticsearch menyediakan fungsi templat pencarian. Artikel ini menjelaskan cara menggunakan templat pencarian Elasticsearch untuk menggunakan kembali dan membagikan kueri.

1. Mengapa menggunakan templat pencarian

Dalam perkembangan sehari-hari, meskipun sebagian besar kueri mungkin relatif sederhana, dalam beberapa skenario bisnis yang kompleks (seperti keuangan, kedokteran, dll.), penelusuran mungkin perlu melewati atau mengembalikan lusinan bidang, dan melibatkan kondisi pemfilteran dan analisis agregasi yang rumit . Pada titik ini, menulis setiap kueri secara manual tidak hanya tidak efisien, tetapi juga rawan kesalahan. Templat pencarian seperti prosedur atau fungsi tersimpan di MySQL. Mereka hanya perlu didefinisikan satu kali, dan fungsi pencarian dapat diselesaikan nanti dalam kode dengan memanggil templat dan meneruskan parameter, yang sangat meningkatkan efisiensi pengembangan dan fleksibilitas kueri.

2. Kasus pengantar pencarian template

2.1 Bentuk standar

Bentuk dasar template pencarian adalah mendefinisikan objek JSON yang berisi kondisi kueri dan pass_search/template panggilan API. Misalnya:

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

Dalam contoh ini,{{kw}}Dan{{size}}adalah variabel dalam templat, diteruskanparamsObjek memberikan nilai tertentu.

2.2 ke format JSON

toJSONBentuknya ditandai dengansource Gunakan string untuk mendefinisikan, dan karakter escape diperlukan. Misalnya:

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

2.3 Melewati parameter dalam metode join

menggunakanjoin Metode ini dapat menggabungkan elemen-elemen dalam array menjadi string untuk kondisi kueri. Misalnya:

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 Bentuk nilai default

Anda dapat mengatur nilai default untuk parameter di templat. Jika parameter tidak diteruskan saat memanggil, nilai default akan digunakan. Misalnya:

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. Hafalkan template dan terapkan panggilan berulang

3.1 Templat penyimpanan Elasticsearch

Untuk menggunakan kembali template, kita dapat menyimpannya di Elasticsearch. Dengan menentukan nama templat, akan lebih mudah untuk memanggilnya berulang kali nanti. Misalnya:

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 Templat panggilan

Saat memanggil templat, lewatiid Untuk menentukan template tertentu dan meneruskan parameter yang sesuai. Misalnya:

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

3.3 Kueri templat yang ditentukan

Informasi template yang ditentukan dapat ditanyakan melalui permintaan GET, misalnya:

GET _scripts/my_test_template
  • 1

3.4 Hapus template yang ditentukan

Jika Anda perlu menghapus templat yang ditentukan, Anda dapat menggunakan permintaan DELETE, misalnya:

DELETE _scripts/my_test_template
  • 1

4. Penerapan Template Pencarian Tingkat Lanjut

4.1 Templat verifikasi

Elasticsearch menyediakan_render/template API untuk memvalidasi templat.