ElasticSearch 比较范围结果

ElasticSearch comparative range results

你好,我想索引看起来像那样的对象

{
   uuid: "123",
   clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{ order: 3, uuid: "789"}]

}

有没有办法编写一个查询来匹配包含的所有对象 带有 uuid: "345" 和 uuid: "789" 的子句,但第二个的顺序最多比第一个大两倍?

所以上面的例子会匹配但下一个不会匹配:

 {
   uuid: "999",
   clauses: [{ order: 1, uuid: "345"},{ order: 2, uuid: "567"},{order: 3, uuid: "777"},{ order: 4, uuid: "789"}]

}

原因是“789”子句的阶数为4,比“345”子句的阶数为1大2倍以上。

感谢任何帮助! 谢谢, 迈克尔

实现此目的的一种方法是使用 script filter

我使用的脚本如下:

def idxs = []; 
for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {
    if (matches.contains(doc['clauses.uuid'].values[i])){
        idxs << i
    }
};
def orders = idxs.collect{ doc['clauses.order'].values[it]}; 
return orders[1] - orders[0] <= 2

基本上,我所做的是首先收集 matches 数组中包含 uuid 的子句的所有索引(即 345 和 789)。 然后,根据我得到的索引,我收集了这些索引处的所有 order 值。最后,我检查第二个 order 减去第一个 order 是否不大于 2.

POST your_index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "clauses.uuid": "345"
          }
        },
        {
          "term": {
            "clauses.uuid": "789"
          }
        },
        {
          "script": {
            "script": "def idxs = []; for (int i = 0; i < doc['clauses.uuid'].values.size(); i++) {if (matches.contains(doc['clauses.uuid'].values[i])){idxs << i}}; def orders = idxs.collect{doc['clauses.order'].values[it]}; return orders[1] - orders[0] <= 2",
            "params": {
              "matches": [
                "345",
                "789"
              ]
            }
          }
        }
      ]
    }
  }
}

这将 return 只有第一个文档而不是第二个文档。