如果找到,则弹性搜索仅从第一个“应该”匹配返回数据

时间:2017-10-28 18:04:35

标签: elasticsearch

对于令人困惑的标题感到抱歉。

我正在尝试构建一个搜索游戏标题或唯一ID的查询,但只有在搜索(并找到)唯一ID时才返回一个结果。

例如,这是使用术语“Portal 2”的搜索。 Portal 2将不会匹配任何“ids.name”字段,因此它会在“name”键中搜索并正确返回该游戏。

{
   "index":"games",
   "type":"game",
   "body":{
      "query":{
         "bool":{
            "should":[
               {
                  "nested":{
                     "path":"ids",
                     "query":{
                        "term":{
                           "ids.name":{
                              "value":"Portal 2",
                              "boost":2
                           }
                        }
                     }
                  }
               },
               {
                  "match":{
                     "name":{
                        "query":"Portal 2"
                     }
                  }
               }
            ]
         }
      }
   }
}

搜索词“portal-2-45218”与ids.name上的完全匹配也是一样的。 它正确匹配第一个“应该”查询,但也返回从第二个查询中找到的游戏。

{
   "index":"games",
   "type":"game",
   "body":{
      "query":{
         "bool":{
            "should":[
               {
                  "nested":{
                     "path":"ids",
                     "query":{
                        "term":{
                           "ids.name":{
                              "value":"portal-2-45218",
                              "boost":2
                           }
                        }
                     }
                  }
               },
               {
                  "match":{
                     "name":{
                        "query":"portal-2-45218"
                     }
                  }
               }
            ]
         }
      }
   }
}

一旦发现与“ids.name”的完全匹配,我将如何以某种方式停止搜索?

1 个答案:

答案 0 :(得分:0)

没有真正的方法来停止搜索"这也是我认为你不想做的事情。您在这里处理两种查询意图(自由文本和完全ID匹配)并急切地搜索这两种情况,以防确切的id匹配没有结果。

有两种方法可以解决这个问题: 1)大力推进其中一个"应该"确保结果通常是第一的条款 2)使用多重搜索(并发搜索)分别执行各种搜索,并检查应用程序端是否有更优化的搜索结果。如果没有,请回到第二个。

对于选项1,您目前的提升为2,并且可以将其提升至20或其他。它有点像hacky,但鉴于结果只会出现在精确的ID匹配上,你可以安全地提升增益(在生产中试验正确的值)

选项2,利用msearch端点。在这种情况下,如果第一个查询返回结果,您只需返回那些!

/_msearch
{"index" : "games", "type" : "game"}
{
  "query":{
    "nested":{
      "path":"ids",
      "query": { "term":{ "ids.name":{ "value":"portal-2-45218" } } }
    }
  }
}
{"index" : "games", "type" : "game"}
{
  "query":{
    "match": { "name": { "query":"portal-2-45218" } }
  }
}