是否可以使用nest来创建带有非强类型关键字/字段的存储桶?
由于该项目的性质。我没有任何要传递的根对象。 下面是一个示例。
var result = client.Search<PortalDoc>(s => s
.Aggregations(a => a
.Terms("agg_objecttype", t => t.Field(l => "CUSTOM_FIELD_HERE"))
)
);
答案 0 :(得分:0)
是的,这样的事情是可能的。使用嵌套字段为我的解决方案寻找here。它允许在“动态”字段上执行所有操作,但是要付出更大的努力(嵌套字段更难操作)。要点有一些搜索证明,但是我也实现了聚合。
curl -XPOST localhost:9200/something -d '{
"mappings" : {
"live" : {
"_source" : { "enabled" : true },
"dynamic" : false,
"properties" : {
"customFields" : {
"type" : "nested",
"properties" : {
"fieldName" : { "type" : "string", "index" : "not_analyzed" },
"stringValue": {
"type" : "string",
"fields" : {
"raw" : { "type" : "string", "index" : "not_analyzed" }
}
},
"integerValue": { "type" : "long" },
"floatValue": { "type" : "double" },
"datetimeValue": { "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd" },
"booleanValue": { "type" : "boolean" }
}
}
}
}
}
}'
搜索应使用AND在同一嵌套查询中完成,并且聚合应在嵌套聚合中完成。 我是针对动态字段制作的,但可能可以针对其他内容进行调整。我怀疑由于索引的工作原理,可搜索/可聚合字段是否会具有更大的灵活性。
答案 1 :(得分:0)
string
implicitly convert to Field
,因此您可以为任何字段名称传递字符串
class ConfigManager {
private parsedConfigObject = null; // currently type is `any` but maybe need to create interface
constructor() {
// get data from the file, dont know in advance it's type
this.parsedConfigObject = yaml.load(PATH_TO_CONFIG_FILE);
this.validateModeNumber();
}
private validateModeNumber(): void {
// Must be 1 or 2 but dont know type yet
const modeNumber = this.parsedConfigObject.modeNumber;
if (modeNumber === undefined) {
throw new Error('Setting "modeNumber" not foud.');
}
if (typeof(modeNumber) != 'number') {
throw new Error(`Setting "modeNumber" must be the number, ${typeof this.parsedConfigObject.modeNumber} found.`);
}
if (!isInteger(modeNumber)) {
throw new Error(`Setting "modeNumber" must be the integer, value ${this.parsedConfigObject.modeNumber} found.`);
}
if (modeNumber !== 1 && modeNumber !== 2) {
throw new Error(`Setting "modeNumber" must be the number, ${typeof this.parsedConfigObject.modeNumber} found.`);
}
}
}