2016-06-07 1 views
0

У меня есть индекс эластичности с типами для разных языков.Многопользовательский поиск в elasticsearch с отдельными идентификаторами после заказа

Мне нужно выбрать различные документы с текущим языком, если они доступны, и любые другие, если текущий язык недоступен.

я могу сделать что-то вроде этого в 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 и не может сортировать по нечисловых полей.

Наверное, пока нет решения этих проблем.

Смежные вопросы