2017-08-15 69 views
1

我面临以下问题。我对索引中的特定记录组进行了一些排序查询,类似于下面的查询,其中term1匹配值针对每个查询而变化,而对于term2,它们对于所有查询都保持静态。Elasticsearch组排序的组合查询

{ 
    "query": { 
     "bool": { 
      "must": { 
       "terms": { 
        "term1": [ "val1", "val2" ] 
       } 
      }, 
      "must_not": { 
       "terms": { 
        "term2": [ "val3", "val4" ] 
       } 
      } 
     } 
    }, 
    "sort": [ 
     { "sort_term": "desc" } 
    ], 
    "from": 0, 
    "size": 10 
} 

现在,我单独执行这些查询,然后合并和洗牌的代码的结果,这东西,你可能会说是不理想的。我想知道是否有办法在ElasticSearch中结合这些查询,同时维护基于组的排序。

我想维护每个单独查询的排序顺序的原因是因为排序值不统一,我不希望来自不同组的结果被隐藏在结果集中。

我能想到的唯一解决方案是以某种方式重新处理所有记录并根据给定组中所有记录的排序值计算相对排序值,但这些值非常有规律地变化,并且索引有大量的记录,所以这可能是矫枉过正。

任何想法将不胜感激!

回答

0

您可以在排序数组中使用多个条款。如果您结合查询,我会首先按_type排序,这可以防止混淆搜索结果。您的查询的排序字段应该是这样的:

"sort": [ 
    { "_type": "desc" }, 
    { "sort_term_query1": "desc" }, 
    { "sort_term_query2": "desc" }, 
], 
+0

我知道我可以使用多个排序术语,但在这种情况下,我的所有查询都使用相同的排序术语。我想要做的是单独对每个布尔项进行排序,并混合结果。 – OrfeasZ

+0

然后我不明白你的问题,它不清楚最终结果应该如何排序。 – MartinSchulze