按外部数据排序

时间:2016-10-25 08:39:36

标签: elasticsearch

我对查询非常困难,不知道我想要的是否可能。

简而言之,我需要根据外部数据对结果进行排序,这些外部数据用于在id(1)范围内进行搜索:

{  
   "from":0,
   "size":30,
   "query":{  
      "function_score":{  
         "functions":[  
            {  
               "weight":2,
               "filter":{  
                  "bool":{  
                     "must":[  
                        {  
                           "query":{  
                              "match_all":{  

                              }
                           }
                        }
                     ]
                  }
               }
            }
         ],
         "query":{  
            "filtered":{  
               "query":{  
                  "bool":{  
                     "must":[  
                        {  
                           "match":{  
                              "validated":true
                           }
                        },
                        {
                           "id": [   //<--- search within given id range
                               "id1",
                               "id2",
                               ....
                               "id3"
                           ]
                        }
                     ]
                  }
               },
               "filter":{  
                  "or":{  
                     "filters":[  
                        {  
                           "and":{  
                              "filters":[  
                                 {  
                                    "term":{  
                                       "_type":"type1"
                                    }
                                 }
                              ]
                           }
                        }
                        ... //allot more
                     ]
                  }
               }
            }
         },
         "score_mode":"sum",
         "boost_mode":"replace"
      }
   },
   "min_score":1.5
}

故事:想象一下,您有多个文档和1个用于收藏夹功能(但它只存储ID,创建日期和更新日期)。 用户在他的收藏夹列表中搜索,他应该按时间顺序获得结果。

(1)我在文档的范围内搜索(默认限制为1024),因为我不想更改索引(扩充数据),它将成为一个繁重的过程(分配字段)。 我想根据这些外部ID的创建日期进行排序。当用户访问各种页面时,该索引将被触发为异步(服务器端)。

基于此,是否可以按外部数据对文档进行排序?

1 个答案:

答案 0 :(得分:0)

我设法找到了解决方案(至少它有效)。我添加了每个id与时间戳分数的权重,以获得最近的第一个如下:

{  
   "from":0,
   "size":30,
   "query":{  
      "function_score":{  
         "functions":[  
            {  
               {
                  "filter":{
                      "term":{
                          "id"=>"id1"
                      }
                  },
                  "weight"=> "timestamp_score" // timestamp divided by 10000000., ex: 14.065543
               }
            }
         ],
         "query":{  
            "filtered":{  
               "query":{  
                  "bool":{  
                     "must":[  
                        {  
                           "match":{  
                              "validated":true
                           }
                        },
                        {
                           "id": [   //<--- search within given id range
                               "id1",
                               "id2",
                               ....
                               "id3"
                           ]
                        }
                     ]
                  }
               },
               "filter":{  
                  "or":{  
                     "filters":[  
                        {  
                           "and":{  
                              "filters":[  
                                 {  
                                    "term":{  
                                       "_type":"type1"
                                    }
                                 }
                              ]
                           }
                        }
                        ... //allot more
                     ]
                  }
               }
            }
         },
         "score_mode":"sum",
         "boost_mode":"replace"
      }
   },
   "min_score":1.5
}

即使使用 1024 id(我当前的最大限制),这也能正常工作,它会影响语句不是整体(最大 1024 过滤语句,最大 1024 得分提升声明)。

任何其他的想法都很好,对我来说似乎有些骇人听闻