如何根据字段内容排除elasticsearch的结果?

时间:2017-09-22 03:58:08

标签: amazon-web-services elasticsearch

我在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文档,但我找不到如何实现这一目标的好例子。

我希望这是有道理的。提前致谢!

2 个答案:

答案 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 : [],
                      },
                    },
                  ],
                },
              },
            },
          },
        },
      });