Обмен технологиями

Шаблоны поиска Elasticsearch: повторное использование и обмен запросами

2024-07-12

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

В повседневной разработке и эксплуатации Elasticsearch (ES) мы часто сталкиваемся со сценариями, когда аналогичные запросы необходимо выполнять часто. Эти запросы могут включать в себя несколько полей, условий фильтрации и агрегатный анализ из-за сложности бизнес-логики. Чтобы оптимизировать эти операции и повысить эффективность разработки, Elasticsearch предоставляет функцию шаблонов поиска. В этой статье объясняется, как использовать шаблоны поиска Elasticsearch для повторного использования и обмена запросами.

1. Зачем использовать шаблоны поиска

В повседневной разработке, хотя большинство запросов могут быть относительно простыми, в некоторых сложных бизнес-сценариях (например, финансы, медицина и т. д.) при поиске может потребоваться передать или вернуть десятки полей и включить сложные условия фильтрации и агрегирования. . На этом этапе написание каждого запроса вручную не только неэффективно, но и чревато ошибками. Шаблоны поиска подобны хранимым процедурам или функциям в MySQL. Их нужно определить только один раз, а функцию поиска можно выполнить позже в коде, вызвав шаблон и передав параметры, что значительно повышает эффективность разработки и гибкость запросов.

2. Вводный пример шаблона поиска

2.1 Стандартная форма

Основная форма шаблона поиска заключается в определении объекта JSON, содержащего условия запроса, и передаче_search/template API-вызовы. Например:

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

В этом примере{{kw}}и{{size}}это переменная в шаблоне, передаваемаяparamsОбъекты передают определенные значения.

2.2 в формате JSON

toJSONФорма характеризуется тем,source Для определения используйте строки, а escape-символы обязательны. Например:

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

2.3 Передача параметров в метод соединения

использоватьjoin Этот метод может объединять элементы массива в строку для условий запроса. Например:

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 Форма значений по умолчанию

Вы можете установить значения по умолчанию для параметров в шаблоне. Если параметр не передается при вызове, будет использовано значение по умолчанию. Например:

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. Запомните шаблон и осуществите повторные звонки

3.1 Шаблон сохранения Elasticsearch

Чтобы повторно использовать шаблон, мы можем сохранить его в Elasticsearch. Указав имя шаблона, его удобно впоследствии неоднократно вызывать. Например:

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 Шаблон звонка

При вызове шаблона передайтеid Чтобы указать конкретный шаблон и передать соответствующие параметры. Например:

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

3.3 Запрос определенного шаблона

Определенную информацию о шаблоне можно запросить с помощью запросов GET, например:

GET _scripts/my_test_template
  • 1

3.4 Удаление определенного шаблона

Если вам нужно удалить определенный шаблон, вы можете использовать запрос DELETE, например:

DELETE _scripts/my_test_template
  • 1

4. Расширенное применение шаблонов поиска

4.1 Шаблон проверки

Elasticsearch предоставляет_render/template API для проверки шаблона.