弹性查询以显示完全匹配或其他字段(如果未找到)

时间:2015-11-25 10:39:28

标签: json search elasticsearch lucene full-text-search

我需要一些帮助来重写我的弹性搜索查询。

我需要的是:

1-如果两个字段verbsessionid.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" } } },
                    ],
                }},
            ],
        },
    },
}

1 个答案:

答案 0 :(得分:0)

Elasticsearch不能修剪"当找到完全匹配时,您的次要结果。

在返回所有结果后,您必须在客户端实施此丢弃功能。

您可能会发现最干净的实现是分别执行两个搜索策略。您的搜索客户端将:

  1. 运行第一个(完全匹配)查询
  2. 仅在未找到结果的情况下运行第二个(展开的)查询