ElasticSearch-Äquivalent zu MongoDB .distinct(...)

English Deutsch

Nehmen wir an, wir haben einen ElasticSearch-Index namens strings mit einem Feld pattern vom Typ {"type": "keyword"}.

Nun möchten wir das Äquivalent von MongoDB db.getCollection('...').distinct('pattern') ausführen:

Lösung

In Python kannst du die iterate_distinct_field()-Hilfsfunktion aus diesem vorherigen Beitrag über ElasticSearch distinct verwenden. Vollständiges Beispiel:

elasticsearch_distinct_helper.py
from elasticsearch import Elasticsearch

es = Elasticsearch()

def iterate_distinct_field(es, fieldname, pagesize=250, **kwargs):
    """
    Hilfsfunktion um alle distinct-Werte aus ElasticSearch abzurufen
    (sortiert nach Anzahl der Vorkommen)
    """
    compositeQuery = {
        "size": pagesize,
        "sources": [{
                fieldname: {
                    "terms": {
                        "field": fieldname
                    }
                }
            }
        ]
    }
    # Über Seiten iterieren
    while True:
        result = es.search(**kwargs, body={
            "aggs": {
                "values": {
                    "composite": compositeQuery
                }
            }
        })
        # Jeden Bucket ausgeben
        for aggregation in result["aggregations"]["values"]["buckets"]:
            yield aggregation
        # "after"-Feld setzen
        if "after_key" in result["aggregations"]["values"]:
            compositeQuery["after"] = \
                result["aggregations"]["values"]["after_key"]
        else: # Fertig!
            break

# Verwendungsbeispiel
for result in iterate_distinct_field(es, fieldname="pattern.keyword", index="strings"):
    print(result) # e.g. {'key': {'pattern': 'mypattern'}, 'doc_count': 315}

Check out similar posts by category: Databases, ElasticSearch, Python