使用.net客户端在elasticsearch上定义索引模板

wh6knrhe  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(334)

我在docker集群中运行了elasticsearch,我使用它来搜索asp.net核心api,该api查询es。我想在集群创建时为es定义索引Map,在docker compose中运行一个作业,该作业使用.net控制台应用程序将请求放在es上以定义Map。
我知道使用模板应该可以帮我完成这项工作,但是我在nest或elasticsearch net中找不到任何最佳实践的例子,所以我想在这里问一下。
我的想法是简单地定义一个模板,应用于任何创建的新索引。然后,我运行一个外部作业,该作业将在新文档需要放入新索引时对任何新索引应用相同的Map。我还想定义一个对所有新索引通用的别名。
我要定义的Map如下:

{
    "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" } }
          ]
      }

问题:
使用模板是正确的方法吗?
如何将其打包成模板?
如何确保所有新索引都具有这些设置,并且它不适用于由es创建的度量或其他默认索引?
模板是否也包含搜索后如何返回\u源的首选项?e、 g.如果我想一致地排除为autosuggest特性添加的字段,但我不想在正常查询中返回该字段?
提前谢谢你的帮助
西蒙

pvabu6sv

pvabu6sv1#

最后利用底层elasticsearch网络客户端解决了这一问题。我有一个配置文件,其中包含模板的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" : {}
  }
}

我发送了模板Map的请求:

// Send a PUT request containing the template
var postMapping =
        _client.LowLevel.DoRequest<StringResponse>(HttpMethod.PUT, "_template/product_template", PostData.String(template.ToString()));

相关问题