我在多个字段中搜索带有通配符的日志,这些通配符查询位于一个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
答案 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"]
}
}
}
} }