数组索引或替代解决方案上的Elasticsearch聚合

问题描述

elasticsearch中有一些类似于以下示例的文档:

{
  "id": "<<some id>>","list": [
    "a","b","c"
  ]
}
{
  "id": "<<some id>>","list": [
    "c","a"
  ]
}

例如list可以按任意顺序包含abc,而不必全部包含。 list中元素的顺序很重要。

我想运行这些存储桶聚合:

  • 多少个文档在任何位置上包含a
  • 多少个文档包含a第一位置

当前文档结构是否可能?我可以用其他方式构造文档吗?

如果当前的结构无法实现,我想考虑一下类似的东西

{
  "id": "<<some id>>","list": {
    "values": ["c","a"],"ordered": {
      "0": "c","1": "a"
    }
  } 
}

{
  "id": "<<some id>>","ordered": {
      "a": 1,"c": 0
    }
  } 
}

使用后者,我还可以运行诸如a < c之类的聚合。

感谢您的帮助

解决方法

可能还有其他更好的方法,但是如果您可以像存储位置一样存储它,然后再输入密钥:

{
  "id": "<<some id>>","list": [
    "1_a","2_b","3_c"
  ]
}

另一个文档,

{
  "id": "<<some id>>","list": [
    "1_c","2_a"
  ]
}

然后您可以对其进行常规聚合,并且返回类似以下内容的

1_a:1
2_a:1 ... etc

此后,在处理过程中,您需要除以_,否则您就可以使用脚本了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...