对于令人困惑的标题感到抱歉。
我正在尝试构建一个搜索游戏标题或唯一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”的完全匹配,我将如何以某种方式停止搜索?
答案 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" } }
}
}