【问题标题】:ElasticSearch comparative range resultsElasticSearch 比较范围结果
【发布时间】:2016-03-21 13:25:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: elasticsearch indexing range-query


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 我会试试的!你认为这可能会占用大量 CPU 资源吗?- 我想实际预先计算每个子句的 forwardClauses,然后使用嵌套过滤。我想知道在检索过程中哪种方法更快。
    • 很明显,无论你在索引时可以计算什么,都去做吧,它在查询时会快得多。
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2017-07-02
    • 2011-08-05
    • 2016-04-27
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    相关资源
    最近更新 更多