具有动态字段的嵌套聚合-Elasticsearch

时间:2018-10-26 19:06:30

标签: elasticsearch nest elasticsearch-6

是否可以使用nest来创建带有非强类型关键字/字段的存储桶?

由于该项目的性质。我没有任何要传递的根对象。 下面是一个示例。

            var result = client.Search<PortalDoc>(s => s
                        .Aggregations(a => a
                            .Terms("agg_objecttype", t => t.Field(l => "CUSTOM_FIELD_HERE"))
                        )     
                    );

2 个答案:

答案 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.`);
        }
    }
}