我有以下mapping
,我正在尝试使用NEST
重写它,但似乎还不太正确。
PUT company
{
"settings": {
"index": {
"analysis": {
"filter": {},
"analyzer": {
"keyword_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"trim"
],
"char_filter": [],
"type": "custom",
"tokenizer": "keyword"
},
"edge_ngram_analyzer": {
"filter": [
"lowercase"
],
"tokenizer": "edge_ngram_tokenizer"
},
"edge_ngram_search_analyzer": {
"tokenizer": "lowercase"
}
},
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 5,
"token_chars": [
"letter"
]
}
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"companyId": {
"type": "keyword"
},
"companyName": {
"type": "text",
"fields": {
"keywordstring": {
"type": "text",
"analyzer": "keyword_analyzer"
},
"edgengram": {
"type": "text",
"analyzer": "edge_ngram_analyzer",
"search_analyzer": "edge_ngram_search_analyzer"
},
"completion": {
"type": "completion",
"contexts": [
{
"name": "companyGroupId",
"type": "category",
"path": "companyGroupId"
}
]
}
},
"analyzer": "standard"
},
"companyTradingName": {
"type": "text",
"index": false
},
"companyGroupId": {
"type": "keyword"
},
"agencyId": {
"type": "keyword"
}
}
}
}
}
这是我到的地方,我仍然需要将关键字字符串和 edgengram 设置为 CompanyName 字段。但不确定如何添加这些分析器
模型
[ElasticsearchType(Name = "company")]
public class CompanyDocument : IDocument
{
public long CompanyId { get; set; }
public CompletionField CompanyName { get; set; } // <-- I think this needs to be set as an CompletionField
public string CompanyTradingName { get; set; }
public long CompanyGroupId { get; set; }
public long AgencyId { get; set; }
}
查询
var response1 = this.Client.CreateIndex(
"testing_testing",
index => index
.Mappings(
ms => ms.Map<CompanyDocument>(
m => m.Properties(
p => p
.Keyword(t => t.Name(n => n.AgencyId))
.Keyword(t => t.Name(n => n.CompanyGroupId))
.Keyword(t => t.Name(n => n.CompanyId))
.Text(t => t.Name(n => n.CompanyName)
.Fields(ff =>
ff.Completion(descriptor => descriptor.Contexts(contextsDescriptor => contextsDescriptor.Category(contextDescriptor => contextDescriptor.Name("CompanyGroupId").Path("CompanyGroupId"))))))
.Text(t => t.Name(n => n.CompanyTradingName).Index(false)))))
.Settings(
f => f.Analysis(analysis => analysis
.Analyzers(analyzers => analyzers
.Custom("keyword_analyzer", _ => _.Filters("lowercase", "asciifolding", "trim").CharFilters().Tokenizer("keyword"))
.Custom("edge_ngram_analyzer", _ => _.Filters("lowercase").Tokenizer("edge_ngram_tokenizer")).Custom("edge_ngram_search_analyzer", _ => _.Tokenizer("lowercase")))
.Tokenizers(
descriptor => descriptor.EdgeNGram("edge_ngram_tokenizer", t => t.MinGram(2).MaxGram(5).TokenChars(TokenChar.Letter))))));
更新
GET company/_search
{
"suggest": {
"company-suggest": {
"prefix": "trans",
"completion": {
"field": "companyName.completion",
"fuzzy": {
"fuzziness": 1
}
}
}
}
}
答案 0 :(得分:0)
我决定不使用它,而不是尝试将其重写为NEST。
所以我创建了一个json
文件,只读取内容,然后仅使用以下内容
var response = this.Client.LowLevel.IndicesCreate<CompanyResponse>("index-name", PostData.Bytes(bytes));
return response.ApiCall.Success;
这似乎比尝试重新创建DSL查询要容易得多