Определение шаблонов индексов в ElasticSearch с помощью клиента .NET

У меня есть ElasticSearch, работающий в кластере Docker, я использую его для поиска через основной API ASP.NET, который запрашивает ES. Я хотел бы определить сопоставления индексов для ES при создании кластера, выполнив задание в моем docker-compose, которое использует консольное приложение .NET для размещения запросов на ES для определения сопоставлений.

Я видел, что использование шаблонов должно помочь мне, но я не могу найти примеры лучших практик в NEST или ElasticSearch-NET, поэтому я решил спросить здесь.

Моя идея заключалась бы в том, чтобы просто определить шаблон, который применяется к любому новому создаваемому индексу. Затем я запускаю внешнее задание, которое заполняет ES, и к любому новому индексу будет применяться одно и то же сопоставление всякий раз, когда новый документ должен быть помещен в новый индекс. Я также хочу определить псевдоним, общий для всех новых индексов.

Сопоставления, которые я хочу определить, следующие:

{
    "settings": {
      "analysis": {
        "filter": {
          "autocomplete_filter": {
            "type": "edge_ngram",
            "min_gram": 1,
            "max_gram": 20
          }
        },
        "analyzer": {
          "autocomplete": {
            "type": "custom",
            "tokenizer": "standard",
            "filter": [
              "lowercase",
              "autocomplete_filter"
            ]
          }
        }
      }
    },
    "mappings": {
      "dynamic": false,
      "properties": {
        "Name": {
          "type": "keyword"
        },
        "Cusip": {
          "type": "keyword"
        },
        "ISIN": {
          "type": "keyword"
        },
        "Ticker": {
          "type": "keyword"
        },
        "suggest": {
          "type": "completion",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
}

И для псевдонима мне нужно использовать что-то вроде этого:

{
          "actions" : [
              { "add" : { "index" : "{index}", "alias" : "product" } }
          ]
      }

Вопросы:

  1. Является ли использование шаблона правильным способом сделать это?
  2. Как мне упаковать его вместе в шаблон?
  3. Как убедиться, что все новые индексы имеют эти настройки и что они не применяются, как метрики или другие индексы по умолчанию, созданные ES?
  4. Охватывают ли шаблоны настройки того, как вернуть _source после поиска? Например. если я хочу постоянно исключать поле, которое добавляется для функции автозаполнения, но которое я не хочу возвращать при обычных запросах?

Заранее спасибо за помощь

Саймон


person szan    schedule 16.09.2020    source источник


Ответы (1)


В конце концов это решается с помощью клиента LowLevel Elasticsearch-net. У меня есть файл конфигурации, содержащий запрос JSON для шаблона:

  "index_patterns": [
    "*"
  ],
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 20
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "dynamic": false,
    "properties": {
      "Name": {
        "type": "keyword"
      },
      "field1": {
        "type": "keyword"
      },
      "field2": {
        "type": "keyword"
      },
      "field3": {
        "type": "keyword"
      },
      "suggest": {
        "type": "completion",
        "analyzer": "autocomplete",
        "search_analyzer": "standard"
      }
    }
  },
  "aliases" : {
    "product" : {}
  }
}

И я отправляю запрос на сопоставление шаблона с этим:

// Send a PUT request containing the template
var postMapping =
        _client.LowLevel.DoRequest<StringResponse>(HttpMethod.PUT, "_template/product_template", PostData.String(template.ToString()));
person szan    schedule 21.09.2020
comment
Мне все еще нужно решить, как обеспечить, чтобы мой шаблон попадал только в новые индексы, а не в индексы метрик или журналов. Если я определю index_pattern как *, это будет применяться ко всем индексам. Есть ли способ указать, что я не хочу применять шаблон к индексам, начинающимся с .? @RussCam - person szan; 21.09.2020