弹性搜索过滤器按嵌套文档中的文件计数

时间:2015-11-10 16:41:05

标签: elasticsearch nested

我在弹性搜索中有这个模式。

79[
    'ID' : '1233',
    Geomtries:[{
        'doc1' : 'F1',
        'doc2' : 'F2'

    },
    (optional for some of the documents)
    {
        'doc2' : 'F1',
        'doc3' : 'F2'
    }]
]

Geometries是一个嵌套元素。 我想得到Geometries中有一个对象的所有文档。

到目前为止尝试过:

"script" : {"script" : "if (Geomtries.size < 2) return true"}

但我得到例外:没有这样的属性GEOMTRIES

2 个答案:

答案 0 :(得分:2)

如果您在映射中将字段设置为nested类型,那么接近的典型doc[fieldkey].values.size()似乎不起作用。我找到了以下脚本:

{
  "from" : 0,
  "size" : <SIZE>,
  "query" : {
    "filtered" : {
      "filter" : {
        "script" : {
          "script" : "_source.containsKey('Geomtries') && _source['Geomtries'].size() == 1"
        }
      }
    }
  }
}

注意:您必须使用_source代替doc

答案 1 :(得分:1)

问题在于您访问脚本中的字段的方式,请使用:

function isItAVowel(letter) {
      var vowel = ["a", "e", "i", "o", "u"];

        if (vowel.indexOf(letter) !=-1) {
          document.getElementById("paragraph").innerHTML = "its vowel";
          return;
        }

      document.getElementById("paragraph").innerHTML = "not vowel";
    }

    isItAVowel("x");

顺便提一下,出于性能原因,我会反规范化并添加GeometryNumber字段。您可以使用transform映射在索引时计算大小。