使用 Must 和 Must not 的 Elasticsearch 查询

Posted

技术标签:

【中文标题】使用 Must 和 Must not 的 Elasticsearch 查询【英文标题】:Elasticsearch query using of Must and must not 【发布时间】:2022-01-20 20:49:27 【问题描述】:

在 ES 查询中我有 IP 字段,现在我想排除一些 IP 的系列。 应排除的ip系列:192.168.0.0/16

这里正在尝试查询,但我遇到了错误。

 
 "size": 0,
 "query": 
  "bool": 
  "filter": [
    
          "match_all": 
            
          
        ,
    
      "range": 
        "timestamp": 
          "gte": "now-1y",
          "lte": "now",
          "format": "epoch_millis"
        
      
    
  ],
  "must_not": 
   "match":
     "ip_address":"192.168*"
   
  
 
 
 

错误: 未能创建查询:'192.168*' 不是 IP 字符串文字

还有什么方法可以排除这个IP系列?

【问题讨论】:

【参考方案1】:

您可以使用范围查询来排除IP地址在192.168.*范围内的所有文档


  "query": 
    "bool": 
      "filter": [
        
          "match_all": 
        ,
        
          "range": 
            "timestamp": 
              "gte": "now-1y",
              "lte": "now",
              "format": "epoch_millis"
            
          
        
      ],
      "must_not": 
        "range": 
          "ip_addr": 
            "gte": "192.168.0.0",
            "lt": "192.168.255.255"
          
        
      
    
  

更新 1:

您可以在 must_not 块内使用多个范围查询,以排除多个 IP 地址范围


  "query": 
    "bool": 
      "filter": [
        
          "match_all": 
        
      ],
      "must_not": [
        
          "range": 
            "ip_addr": 
              "gte": "192.168.0.0",
              "lt": "192.168.255.255"
            
          
        ,
        
          "range": 
            "ip_addr": 
              "gte": "10.0.0.0",
              "lt": "10.255.255.255"
            
          
        
      ]
    
  

【讨论】:

感谢 ESCoder,我们可以在其中添加多个 IP 范围吗?喜欢加10.0.0.0 @mkail 你想在范围查询中包含10.0.0.0 吗? 是的,想在查询中包含这个范围 你能帮忙吗?想要添加多个 IP 范围。 @mkail 已经很久了!如果它帮助您解决了您的问题,您能否接受并投票赞成答案。 TIA ;-)

以上是关于使用 Must 和 Must not 的 Elasticsearch 查询的主要内容,如果未能解决你的问题,请参考以下文章

报错:numRecords must not be negative

如何将 must_not 与 ElasticSearch + Grails 的空 JSON 属性一起使用?

使用 pickle.dump - TypeError: must be str, not bytes

WINDOWS.H already included. MFC apps must not #i

FLinkAssigned key must not be null

TypeError: write() argument must be str, not bytes报错