【问题标题】:Elasticsearch trying to query term and time rangeElasticsearch 尝试查询术语和时间范围
【发布时间】:2016-10-07 22:28:43
【问题描述】:
我正在尝试查找内容字段包含单词“syria”并且纪元时间大于 1465312440000 的所有文档。以下查询运行,但只返回包含单词“syria”的文档。我该如何解决这个问题?(Elasticsearch 2.2 版)
{
"query": {
"filtered": {
"query": {
"match": {
"content": "syria"
},
"filter": {
"term": {
"sourceOriginator": "Twitter"
},
"bool": {
"range": {
"epochCollectionDate": {
"gte": 1465312440
}
}
}
}
}
}
}
}
【问题讨论】:
标签:
json
elasticsearch
lucene
【解决方案1】:
当然没有数据很难测试,但是过滤器是错误的。它应该与第二个查询处于同一级别。我认为以下解决方案更容易:
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "syria"
}
}
],
"filter": [
{
"term": {
"sourceOriginator": "Twitter"
}
},
{
"range": {
"epochCollectionDate": {
"gte": 1465312440
}
}
}
]
}
}
}
【解决方案2】:
为了补充@Jettro 的解决方案,它只适用于 ES 2.0 及更高版本,以下解决方案将适用于 ES 5 之前的所有版本。
{
"query": {
"filtered": {
"query": {
"match": {
"content": "syria"
}
},
"filter": {
"bool": {
"must": [
{
"term": {
"sourceOriginator": "Twitter"
}
},
{
"range": {
"epochCollectionDate": {
"gte": 1465312440
}
}
}
]
}
}
}
}
}
请注意,如果您使用的是 ES 2.0 或更高版本,您应该真正使用 @Jettro 的解决方案,因为 filtered 查询已在 2.0 中被弃用。
【解决方案3】:
谢谢各位。
我为此苦苦挣扎,所以如果有人也在寻找如何通过聚合来做到这一点,我使用了 winlogbeat,但它可以与其他索引一起使用,只需更改术语和字段名称。
我用 Elastic 7.1.1 对此进行了测试
{
"size": 0,
"query": {
"bool": {
"must": [
{
"match": {
"winlog.event_id": "5156"
}
}
],
"filter": [
{
"term": {
"winlog.provider_name" : "Microsoft-Windows-Security-Auditing"
}
},
{
"range": {
"@timestamp": {
"gt": "now-10d",
"lt": "now"
}
}
}
]
}
},
"aggregations": {
"event_count": {
"value_count": {
"field": "winlog.event_id"
}
},
"group_by_host": {
"terms": {
"field": "host.name",
"size": 10,
"min_doc_count": 1,
"shard_min_doc_count": 0,
"show_term_doc_count_error": false,
"order": [
{
"_count": "desc"
},
{
"_key": "asc"
}
]
}
},
}
}