我在AWS上使用elasticsearch来存储来自Cloudfront的日志。我创建了一个简单的查询,它将为我提供过去24小时的所有条目,从新到旧排序:
{
"from": 0,
"size": 1000,
"query": {
"bool": {
"must": [
{ "match": { "site_name": "some-site" } }
],
"filter": [
{
"range": {
"timestamp": {
"lt": "now",
"gte": "now-1d"
}
}
}
]
}
},
"sort": [
{ "timestamp": { "order": "desc" } }
]
}
现在,我想要排除结果的某些来源(基于用户代理)。所以我的问题归结为:
当特定字段包含某个字符串时,如何过滤掉结果中的条目?或者:
query.filter.where('cs_user_agent').does.not.contain('Some string')
(显然,这不是真正的代码。)
我试图理解Elasticsearch文档,但我找不到如何实现这一目标的好例子。
我希望这是有道理的。提前致谢!
答案 0 :(得分:1)
好的,我明白了。我所做的是将Bool Query与通配符结合使用:
{
"from": 0,
"size": 1000,
"query": {
"bool": {
"must": [
{ "match": { "site_name": "some-site" } }
],
"filter": [
{
"range": {
"timestamp": {
"lt": "now",
"gte": "now-1d"
}
}
}
],
"must_not": [
{ "wildcard": { "cs_user_agent": "some string*" } }
]
}
},
"sort": [
{ "timestamp": { "order": "desc" } }
]
}
这基本上匹配包含“some string”的任何用户代理字符串,然后将其过滤掉(因为“must_not”)。
我希望这可以帮助遇到这个问题的其他人。
答案 1 :(得分:0)
nod.js 客户端版本:
const { from, size, value, tagsIdExclude } = req.body;
const { body } = await elasticWrapper.client.search({
index: ElasticIndexs.Tags,
body: {
from: from,
size: size,
query: {
bool: {
must: {
wildcard: {
name: {
value: `*${value}*`,
boost: 1.0,
rewrite: 'constant_score',
},
},
},
filter: {
bool: {
must_not: [
{
terms: {
id: tagsIdExclude ? tagsIdExclude : [],
},
},
],
},
},
},
},
},
});