2016-06-07 2 views
0

Ich habe elastischen Index mit Typen für verschiedene Sprachen.Multi-Type-Suche in Elasticsearch mit eindeutigen IDs nach der Bestellung

Ich muss verschiedene Dokumente mit der aktuellen Sprache auswählen, falls verfügbar, und jede andere, wenn die aktuelle Sprache nicht verfügbar ist.

Ich kann in PostgreSQL etwas tun (obwohl es wahrscheinlich einen besseren Weg, dies zu tun):

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 

Ich frage mich, ob es möglich ist, so in Elasticsearch zu tun?

P.S. Ich hätte alle lokalisierten Felder in einem Dokument speichern können, aber das Problem ist, dass ich meistens nur ein bestimmtes Gebietsschema auswählen muss.

Antwort

0

Ich habe es geschafft, so etwas zu erreichen:

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

Aber es gibt zwei Probleme: Ich habe nicht von top_ids für Bedingungen und kann nicht sortieren nach nicht-numerische Felder.

Ich denke, für jetzt gibt es keine Lösung für diese Probleme.

Verwandte Themen