0

嗨,我想索引看起来像这样的对象

{
   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 个以上。

任何帮助表示赞赏!谢谢,迈克尔

4

1 回答 1

1

实现此目的的一种方法是使用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

基本上,我所做的是首先收集数组中包含 a 的子句的所有索引uuidmatches即 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"
              ]
            }
          }
        }
      ]
    }
  }
}

这将只返回第一个文档,而不是第二个。

于 2016-03-21T05:25:34.187 回答