NET客户端在ElasticSearch上定义索引模板

问题描述

我在Docker群集中运行ElasticSearch,我用它来搜索查询ES的ASP.NET核心API。 我想在创建群集时为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的首选项?例如。如果我要始终排除为自动建议功能添加的字段,但又不想在普通查询中返回该字段?

预先感谢您的帮助

西蒙

解决方法

最后使用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()));

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...