0

我正在使用 ElasticSearch 在应用程序中进行日志记录。我需要编写一个日志查看器来过滤我文档的所有字段。

我的文件如下所示:

    "_source": {
       "timestamp": 1373502012000,
       "userId": 6,
       "paId": 56331,
       "lId": 6,
       "prId": 2,
       "vId": 6336,
       "actionType": "LOAD_DATA"
    }

actionType是一个枚举(Java)。

我需要编写一个等效于以下 SQL 查询的 ElasticSearch:

SELECT * FROM snapshot.action_log_item 

WHERE timestamp BETWEEN 1372718783286 AND 1372718783286

AND userId=6 
AND paId=56331 
AND lId=6 
AND prId=2 
AND vId=6336
AND (
    actionType='LOAD_DATA' OR 
    actionType='SAVE_DATA' OR 
    actionType='LOG_IN'
);

请帮助我编写一个正确嵌套的查询和/或过滤器,以获得与我的 SQL 语句等效的结果。

编辑这是我当前的代码(不使用该{ "or"...部分)。

{
  "query" : {
    "bool" : {
      "must" : [ {
        "term" : {
          "userId" : 6
        }
      }, {
        "term" : {
          "lId" : 6
        }
      }, {
        "term" : {
          "vId" : 6336
        }
      } ]
    }
  },
  "filter" : {
    "and" : {
      "filters" : [ {
        "term" : {
          "paId" : 56331
        }
      }, {
        "range" : {
          "timestamp" : {
            "from" : 1372718783286,
            "to" : 1377643583286,
            "include_lower" : true,
            "include_upper" : true
          }
        }
      }, {
        "or" : {
          "filters" : [ {
            "term" : {
              "actionType" : "LOAD_DATA"
            }
          }, {
            "term" : {
              "actionType" : "SAVE_DATA"
            }
          }, {
            "term" : {
              "actionType" : "LOG_IN"
            }
          } ]
        }
      } ]
    }
  }
}

编辑:以下查询有效。它与上面的查询不同,但它返回了预期的结果。这些过滤器/查询似乎在actionType现场不起作用。

{
  "size": 30, 
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "uId": 6
              }
            },
            {
              "term": {
                "loId": 6
              }
            },
            {
              "term": {
                "prId": 2
              }
            },
            {
              "terms": {
                "paId": [
                  56331,
                  56298
                ],
                "minimum_should_match": 1
              }
            }
          ]
        }
      },
      "filter": {
        "range": {
          "timestamp": {
            "from": 1372718783286,
            "to": 1377643583286,
            "include_lower": true,
            "include_upper": true
          }
        }
      }
    }
  }
}
4

1 回答 1

1

{or...部分应如下所示:

{
  "or": [
    {
      "term": {
        "actionType": "LOAD_DATA"
      }
    },
    {
      "term": {
        "actionType": "SAVE_DATA"
      }
    },
    {
      "term": {
        "actionType": "LOG_IN"
      }
    }
  ]
}

您可以在此处查看该过滤器的文档

编辑

我看到您遇到问题,我重写了您的查询。我希望它有帮助

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "userId": 6
              }
            },
            {
              "term": {
                "paId": 56331
              }
            },
            {
              "term": {
                "lId": 6
              }
            },
            {
              "term": {
                "prId": 2
              }
            },
            {
              "term": {
                "vId": 6336
              }
            },
            {
              "terms": {
                "actionType": [
                  "LOAD_DATA",
                  "SAVE_DATA",
                  "LOG_IN"
                ],
                "minimum_should_match": 1
              }
            }
          ]
        }
      },
      "filter": {
        "range": {
          "timestamp": {
            "from": 1372718783286,
            "to": 1377643583286,
            "include_lower": true,
            "include_upper": true
          }
        }
      }
    }
  }
}

基本上我将日期范围作为过滤器,其他条件是布尔查询子句内的查询termmust您可以看到该or部分现在must作为terms查询在子句中,or在这 3 个值之间起作用。

于 2013-09-04T21:06:39.823 回答