问题描述
我在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" } }
]
}
问题:
- 使用模板是正确的方法吗?
- 如何将它们打包成一个模板?
- 如何确保所有新索引都具有这些设置,并且不适用于ES创建的指标或其他默认索引?
- 模板是否还涵盖搜索后如何返回_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()));