Dokumente indexieren und Suchen mit Elastic - Teil 2

Dokumente mit Elasticsearch schreiben und suchen

Im vorherigen Teil haben wir bereits das Kopf plugin kennengelernt. Mit diesem können die Rest Endpunkte bequem über den Browser aufgerufen werden. Die folgenden Operationen kannst du also mit dem Kopfplugin oder z.b. per Curl auf der Kommandzeile ausführen.

 

Indexes und Types

Ein Dokument wird in einen Index geschrieben. Im voherigen Teil haben wir gelernt, was Indexes sind und wie sie auf shards verteilt werden.

 

Ein Index besitzt eine weitere Dimension, die "Type" genannt wird. Dieser "type" dient dazu Dokumente eines Indexes logisch zu trennen.

 

Die Url für ein Dokument ist aber immer:

 

http://elaticnode:elasticport/index/type/id

Dokument mit curl schreiben

Wenn ein index noch nicht existiert, so wird er automatisch angelegt. Standardmässig wird das Schema, also der Datentyp der einzelnen Felder eines Dokumentes dynamisch bestimmt. Dadurch kann man zu beginn einfach ein JSON Dokument an die API schicken und es speichern:

curl -PUT -d '{"name": "hello world"}' http://localhost:9200/my_first_index/my_first_type

Hierbei fehlt die id des Dokumentes. Diese wird beim schreiben in elastic automatisch generiert. Der Response zeigt an, dass das Dokument erfolgreich indexiert wurde:

{
    "_index":"my_first_index",
    "_type":"my_first_type",
    "_id":"AVD_uiMUngvjD4G5EJK9",
    "_version":1,
    "_shards":
       {"total":2,"successful":1,"failed":0},
    "created":true
}

Mittels GET können wir es nun wieder abrufen vom index:

 

curl -GET http://localhost:9200/my_first_index/my_first_type/AVD_uiMUngvjD4G5EJK9

{
   "_index":"my_first_index",
   "_type":"my_first_type",
   "_id":"AVD_uiMUngvjD4G5EJK9",
   "_version":1,
   "found":true, 
   "_source":{"name": "hello world"}
}

Nun legen wir ein weiteres Dokument an um ein bisschen die Querysyntax kennenlernen zu können:

curl -PUT -d '{"name": "hello plante"}' http://localhost:9200/my_first_index/my_first_type

Wir haben nun zwei Dokumente in elastic indexiert. Das erste Dokument hat den Namen "hello world" und das zweite hat den Namen "hello planet".

 

Eine einfache Search Query mit Elasticsearch

Unsere erste query soll uns alle Dokumente liefern, die den Term "hello" im Namen haben, also alle Dokumente die wir indexiert haben.


Spätestens bei solchen Queries ist das Handling mit Curl unpraktisch ;) und ein Curl Plugin oder Kopf leisten gute Dienste.

GET http://localhost:9200/my_first_index/my_first_type/_search
{
  "query": {
    "match": {
      "name": "hello"
    }
  }
}

Im Response sehen wir beide Dokumente:

 

{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 0.19178301,
    "hits": [
      {
        "_index": "my_first_index",
        "_type": "my_first_type",
        "_id": "AVD_yeetngvjD4G5EJLD",
        "_score": 0.19178301,
        "_source": {
          "name": "hello planet"
        }
      },
      {
        "_index": "my_first_index",
        "_type": "my_first_type",
        "_id": "AVD_uiMUngvjD4G5EJK9",
        "_score": 0.19178301,
        "_source": {
          "name": "hello world"
        }
      }
    ]
  }
}

Navigation