2017-10-28 106 views
0

很抱歉的混乱冠军。制作elasticsearch只返回第一个数据“应该”符合如发现

我试图建立一个查询,搜索或者游戏标题或唯一的ID,但只有一个唯一的ID搜索(发现)返回一个结果。

例如,下面是一个使用术语“传送门2”的搜索。 Portal 2将不匹配任何“ids.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" 
        } 
        } 
       } 
      ] 
     } 
     } 
    } 
} 

这里是与不上ids.name精确匹配搜索词“门户-2-45218”同样的事情。 它匹配正确的第一个“应该”查询,但也返回从第二个查询找到的游戏。

{ 
    "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

有没有真正的方法来“停止搜索”,这也是你想要的东西做的,我不认为。您在这里处理两种查询意图(自由文本和准确的id匹配),并且在确切的id匹配没有结果的情况下热切地搜索这两种情况。

有两种方法,你可以接近这样的: 1)重提升“应该”的条款之一,以确保结果通常是第一 2)执行各种搜索单独使用multisearch(并发搜索)和检查应用方面更优化的搜索是否有结果。如果不是,则回落到第二个。

对于选项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" } } 
    } 
} 
+0

谢谢,看起来像选项2是最适合我的。 – Ben

相关问题