2016-06-07 67 views
0

我有弹性指数与不同语言的类型。弹性搜索中的多类型搜索,使用不同的ID后排序

我需要使用当前语言选择不同的文档(如果可用)以及任何其他语言(如果当前语言不可用)。

我可以做的PostgreSQL这样的事情(虽然有可能是一个更好的方式来做到这一点):

SELECT DISTINCT ON (i) * FROM 
(SELECT * FROM 
(SELECT id i, name n, locale l, f_active a FROM news c 
UNION ALL 
SELECT id i, name n, locale l, (SELECT cc.f_active FROM news cc WHERE cc.id = cl.id) a FROM news_locale cl 
) s 
ORDER BY l = 'en' DESC 
) ss 
WHERE a = true 

我在想,如果有可能在elasticsearch这样做呢?

P.S.我可以将所有本地化的字段存储在一个文档中,但问题是大多数时候我只需要选择一个特定的区域设置。

回答

0

我已经成功地实现这样的:

{ 
     "query": { 
      "query_string": { 
       "query": "(isActive:true) AND (isDeleted:false)" 
      } 
     }, 
     "aggs": { 
      "top_ids": { 
       "terms": { 
        "field": "id", 
        "order": { 
         "title": "desc" 
        }, 
        "size": 10 
       }, 
       "aggs": { 
        "top_ids_hits": { 
         "top_hits": { 
          "sort": { 
           "_script": { 
            "type": "number", 
            "script": { 
             "inline": "doc['locale'].value == lang ? 1 : 0", 
             "params": { 
              "lang": "ru" 
             } 
            }, 
            "order": "desc" 
           }, 
           "_score": { 
            "order": "desc" 
           } 
          }, 
          "size": 1 
         } 
        }, 
        "title": { 
         "max": { 
          "field": "num_field" 
         } 
        } 
       } 
      } 
     }, 
     "size": 0 
    } 

但这里有两个问题:我不能从top_ids条款设置,不能排序的非数字字段。

我想现在没有解决这些问题的方法。