我需要一些帮助来重写我的弹性搜索查询。
我需要的是:
1-如果两个字段verb
和sessionid.raw
上存在完全匹配,则显示单个记录(不接受部分匹配)。
"must": [
{ "match" : { "verb" : "login" } },
{ "term" : { "sessionid.raw" : strSessionID } },
]
OR
2-显示与其他一些字段匹配的前5个记录(按_score DESC
和@timestamp ASC
排序),如果记录在指定的时间范围之间,则会提示。
"must": [
{ "match" : { "verb" : "login" } },
{ "term" : { "pid" : strPID } },
],
"should": [
{ "match" : { "user.raw" : strUser } },
{ "range" : { "@timestamp" : {
"from" : QueryFrom,
"to" : QueryTo,
"format" : DateFormatElastic,
"time_zone" : "America/Sao_Paulo",
"boost" : 2 }
} },
]
以下代码几乎可以满足我的需求。
现在,如果找到它会将sessionid.raw
提升到顶部,但其余记录不会被丢弃。
var objQueryy = {
"fields" : [ "@timestamp", "program", "pid", "sessionid.raw", "user", "frontendip", "frontendname", "_score" ],
"size" : ItemsPerPage,
"sort" : [ { "_score" : { "order": "desc" } }, { "@timestamp" : { "order" : "asc" } } ],
"query" : {
"bool": {
"must": [
{ "match" : { "verb" : "login" } },
{ "term" : { "pid" : strPID } },
{ "bool": {
"should": [
{ "match" : { "user.raw" : strUser } },
{ "match" : { "sessionid.raw": { "query": strSessionID, "boost" : 3 } } },
{ "range" : { "@timestamp" : { "from": QueryFrom, "to": QueryTo, "format": DateFormatElastic, "time_zone": "America/Sao_Paulo" } } },
],
}},
],
},
},
}
答案 0 :(得分:0)
Elasticsearch不能修剪"当找到完全匹配时,您的次要结果。
在返回所有结果后,您必须在客户端实施此丢弃功能。
您可能会发现最干净的实现是分别执行两个搜索策略。您的搜索客户端将: