弹性搜索,应该在里面

时间:2016-09-21 18:28:34

标签: elasticsearch

我在多个字段中搜索带有通配符的日志,这些通配符查询位于一个should类中,除了我用通配符搜索的字段之外的每个日志都有一个" action_id"字段,我想只返回匹配一个或多个通配符的日志,并且有一个或多个我想要的action_id,(例子中的A或B)。

什么行不通:

    q={
        "size" : 20,
        "sort" : [
            { "clsfd_id" : {"order" : "asc"}},
        ],
        "fields":
        "query":{  
           "filtered":{  
              "query":{  
                 "match_all":{  

                 }
              },
              "filter":{  
                 "bool":{  
                    "should":[  
                       {  
                          "query":{  
                             "term":{  
                                "id":"*12*"
                             }
                          }}                  #gets filled dynamically with wildcard queries
                       ],
                       "should":[  
                          {"query":{  
                             "term":{  
                                "action_id":"A"
                             }
                            }
                          },
                          {"query":{  
                             "term":{  
                                "action_id":"B"
                             }
                            }
                          },
                 ]
              }
           }
        }
        }
    } 

示例文档:

{
  "_index": "logs",
  "_type": "log",
  "_id": "AVdPQBuRkYFjD-WA9CiE",
  "_score": null,
  "_source": {
    "username": "Ιδιώτης",
    "user_id": null,
    "action_on": "Part",
    "ip": "sensitive info",
    "idents": [
      "sensiti",
      "sensitive info"
    ],
    "time": "2016-09-21T19:18:11.184576",
    "id": 5993765,
    "changes": "bla bla bla",
    "action_id": "A"
  }

*顺便说一下,这是弹性1.7

2 个答案:

答案 0 :(得分:0)

“我只想返回与通配符匹配的日志”

那么它不应该是must子句而不是should吗?此外,terms filter可以使用多个术语候选项,因此您无需为action_id A和B创建单独的过滤器。阅读文档时请注意,查询DSL在1.x和2之间发生了很大变化。 x版本的Elastisearch,过滤器和查询或多或少地“合并”在一起。

编辑:根据评论,这应该可以正常运行,假设原始查询正常运行(抱歉太懒了,无法测试):

{
    "size": 20,
    "sort": [{"clsfd_id" : {"order" : "asc"}}],
    "query":{
       "filtered":{
          "query":{"match_all":{}},
          "filter":{
             "bool":{
                "should":[
                   {
                      "query":{
                         "term": {"id":"*12*"}
                      }
                   },
                   {
                      "query":{
                         "term": {"id":"*23*"}
                      }
                   }
                ],
                "must":[
                   {
                       "query":{
                         "term": {"action_id": ["A", "B"]}
                      }
                   }
                ]
             }
          }
       }
    }
}

更详细的选项是创建一个新的“query => filtered => filter => should => terms”而不是多项过滤器。

答案 1 :(得分:0)

这有用吗?

{
"size" : 20,
"sort" : [{
        "date" : {
            "order" : "asc"
        }
    }
],
"fields" : [],
"query" : {
    "filtered" : {
        "query" : {
            "wildcard" : {
                "id" : {
                    "value" : "*12*"
                }
            }
        },
        "filter" : {
            "terms" : {
                "action_id" : ["A", "B"]

            }
        }
    }
} }