Skip to content

3_Abfragen mit Query DSL und CURL

marahellstern edited this page Mar 24, 2017 · 1 revision

!!! Diese Seite wurde als Hilfsseite während der Entwicklung erstellt und enthält gegebenfalls veraltete Angaben! !!!

Abfragen mit Query DSL

Begriffe

  • Queries: Suchabfragen bestehen aus einer oder mehreren Queries
  • Filter: Sind eine spezielle Art von Query (sie beziehen sich auf ein Feld und sind speziell performant)

Beispiele

Alles ausgeben

Variante 1:

GET lsb/bibliographicResource/_search

Variante 2:

GET lsb/bibliographicResource/_search
{
    "query": {
        "match_all": {}
    }
}

Quelle: http://okfnlabs.org/blog/2013/07/01/elasticsearch-query-tutorial.html

Exakte Suche nach einem bestimmten Autor/Werk etc. (mittels ID)

GET /lsb/person/_search
{
"query": {
"filtered": {
"filter": {
"bool": {
  "must": {"term": {"_id": "http://data.swissbib.ch/person/aa23c630-97bd-358f-88eb-c1b4fb1fc629"}}
}
}
}
}
}

Exakte Suche nach mehreren Autoren/Ressourcen etc. (mittels ID)

GET lsb/bibliographicResource/_search
{
    "query" : {
        "filtered" : {
            "filter" : {
                "terms" : {
                    "_id" : ["http://data.swissbib.ch/resource/32497695X", 
                    "http://data.swissbib.ch/resource/32887101X"] 
                }
            }
        }
    }
}

Exakte Suche nach Autoren mittels Vor- und Nachname

GET /lsb/person/_search
{
"query": {
"filtered": {
"filter": {
"bool": {
  "must": {"term": {"foaf:lastName": "bolz"}},
  "must": {"term": {"foaf:firstName": "reinhardt"}}
}
}
}
}
}

Achtung: Hier können dennoch mehrere Resultate zurückgeliefert werden, da die Kombination von Vor- und Nachname im Gegensatz zur Personen-ID selbst nicht eindeutig ist (z.B. könnten im Index mehere Autoren mit dem Namen Max Meier enthalten sein).

Suche nach mehreren Personen mit gegebenen IDs

GET /lsb/person/_search
{
  "query": {
    "filtered": {
      "filter": {
        "in": {
          "@id": ["http://data.swissbib.ch/person/aa23c630-97bd-358f-88eb-c1b4fb1fc629", "http://data.swissbib.ch/person/2b8fcc4a-c43a-3e12-8cb9-afc1c21aa6aa", "http://data.swissbib.ch/person/d633b16c-95b4-3fb3-a646-f7009c84f78b"]
        }
      }
    }
  }
}

Suche nach Werken mit gegebener GND-ID (dct:subject)

GET lsb/bibliographicResource/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "dct:subject": ["http://d-nb.info/gnd/4037822-6"]
              }
            }
          ]
        }
      }
    }
  }
}

Suche nach Personen, welche bestimmte Inhalte (Felder/Properties) besitzen oder bestimmte Inhalte (Felder/Properties) nicht besitzen

GET testsb/person/_search
{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "missing": {
                "field": "foaf:name"
              }
            },
                        {
              "missing": {
                "field": "foaf:firstName"
              }
            },
                                    {
              "missing": {
                "field": "foaf:lastName"
              }
            },
                                                {
              "exists": {
                "field": "schema:givenName"
              }
            },
                                                {
              "missing": {
                "field": "schema:firstName"
              }
            }
          ]
        }
      }
    }
  }
}

Abfragen mit CURL

Einmalige Vorbereitungsschritte

sudo apt-get install openjdk-8-jdk-headless python-pip
sudo pip install colout
echo "alias ppj='python -m json.tool | native2ascii -encoding UTF-8 -reverse | colout -t json'" >> ~/.bash_aliases
source ~/.bash_aliases 

Quellen:

Abfragen durchführen (Beispiele)

Wichtig! Das abschliessende Anführungszeichen ' muss auf eine neue Zeile gesetzt werden, sonst wird die letzte Zeile der Abfrage ignoriert. (Symptome sind dann, dass eine unvollständige oder leere Antwort zurückgeliefert wird.)

Beliebige Treffermenge

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/lsb/person/_search' -d '
{
"query": {"match_all": {}}, "size": 100, "from": 10
}
'

Bedeutung:

  • size : Anzahl zurückzugebende Treffer
  • from : Offset

Quelle: https://www.elastic.co/guide/en/elasticsearch/reference/current/_introducing_the_query_language.html

Exakte Suche nach Autor aufgrund ID

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/lsb/person/_search' -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
  "must": {"term": {"@id": "http://data.swissbib.ch/person/d633b16c-95b4-3fb3-a646-f7009c84f78b"}}
}
}
}
}
}
'

Exakte Suche nach bibliographicResource aufgrund ID

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/lsb/bibliographicResource/_search' -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
  "must": {"term": {"@id": "http://data.swissbib.ch/resource/32887101X"}}
}
}
}
}
}
'

Exakte Suche nach Subject aufgrund ID

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/gnd/_search' -d '
{
"query": {
"filtered": {
"filter": {
"bool": {
  "must": {"term": {"_id": "http://d-nb.info/gnd/4134999-4"}}
}
}
}
}
}
'

Bemerkung: Suchen nach @id funktioniert bei gnd nicht.

Exakte Suche nach Subject über beliebiges Feld

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/gnd/_search' -d '
{"query":{"multi_match":{"fields":["@id"],"type":["cross_fields"],"operator":["and"],"query":"http://d-nb.info/gnd/4134999-4"}}}
'

Autor mit bestimmtem Feld suchen

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/lsb/person/_search' -d '
{
"query": {"match_all": {}}, "size": 10000, "from": 0
}
' | ppj | grep -A50 -B200 'lsb:dbpNationalityAsLiteral'

Mittels grep wird nach dem gewünschten Feld gesucht. Es werden auch die 200 vorhergehenden Zeilen (Before), sowie die 50 nachfolgenden Zeilen (After) ausgegeben. Die Resultate werden abgetrennt mittels einer Zeile mit Inhalt --.

Falls die Konsole anschliessend eingefärbt oder sonstwie kaputt ist, kann sie mit reset zurückgesetzt werden.

Multisearch

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/lsb/person/_msearch' -d '
{"index":"lsb","type":"person"}
{"query":{"multi_match":{"fields":["@id"],"type":["cross_fields"],"operator":["and"],"query":"http://data.swissbib.ch/person/d633b16c-95b4-3fb3-a646-f7009c84f78b"}}}
{"index":"lsb","type":"bibliographicResource"}
{"query":{"multi_match":{"fields":["dct:contributor"],"type":["cross_fields"],"operator":["and"],"query":"http://data.swissbib.ch/person/aa23c630-97bd-358f-88eb-c1b4fb1fc629"}}}
'

Multisearch auf Subjects

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/gnd/_msearch' -d '
{"index":"gnd","type":"DEFAULT"}
{"query":{"multi_match":{"fields":["@id"],"type":["cross_fields"],"operator":["and"],"query":"http://d-nb.info/gnd/807915-8"}}}
{"index":"gnd","type":"DEFAULT"}
{"query":{"multi_match":{"fields":["@id"],"type":["cross_fields"],"operator":["and"],"query":"http://d-nb.info/gnd/4134999-4"}}}
'

Mehrere Subjects aufgrund ihrer ID suchen

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/gnd/_search' -d '
{
"query": {
"filtered": {
"filter": {
"in": {
"_id": ["http://d-nb.info/gnd/807915-8", "http://d-nb.info/gnd/4134999-4", "http://d-nb.info/gnd/4134999-4"]
}
}
}
}
}
'

Anzahl Treffer zählen

Der Unterschied besteht in der ersten Zeile (_count anstatt _search)

curl -XGET 'sb-ues1.swissbib.unibas.ch:8080/gnd/_count' -d '
{
"query": {
"filtered": {
"filter": {
"in": {
"_id": ["http://d-nb.info/gnd/807915-8", "http://d-nb.info/gnd/4134999-4", "http://d-nb.info/gnd/4134999-4"]
}
}
}
}
}
'

Quelle: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html

Ausgabe verschönern

Die Ausgabe kann verschönert dargestellt werden, indem folgendes an die curl-Abfrage angehängt wird:

| ppj (dessen Inhalt wir weiter oben definiert haben)