Zapytania do ElasticSearch wysyłamy REST-owo. Do prostego pobierania dokumentów wystarczą nam sparametryzowane zapytania typu GET. Aby jednak poznać pełnię możliwości ElasticSearch musimy poznać język zapytań DSL, w którym parametry zapytania ustawiamy poprzez załączenie z żądaniem typu POST odpowiedniego obiektu w postaci JSON. ElasticSearch udostępnia wiele rodzajów zapytań. Poniżej ciekawsze z nich.
Term Query
Tego typu zapytania można wykonywać na dwa sposoby. Przy użyciu czasownika GET
http://localhost:9200/books/book/_search?q=title:parallel&pretty=true
lub za pomocą czasownika POST
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 59
{
"query" : {
"term" : { "title" : "parallel" }
}
}
W obu przypadkach otrzymujemy ten sam rezultat
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 809
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.095891505,
"hits" : [ {
"_index" : "books",
"_type" : "book",
"_id" : "1",
"_score" : 0.095891505, "_source" : {
"title": "Parallel Worlds: A Journey Through Creation, Higher Dimensions, and the Future of the Cosmos",
"author": "Michio Kaku",
"year": 2006,
"price": 12.06
}
}, {
"_index" : "books",
"_type" : "book",
"_id" : "3",
"_score" : 0.095891505, "_source" : {
"title": "Hyperspace: A Scientific Odyssey Through Parallel Universes, Time Warps, and the Tenth Dimension",
"author": "Michio Kaku",
"year": 1995,
"price": 16.36
}
} ]
}
}
Term Query to takie zapytanie, które zwraca wyniki tylko wtedy, gdy podamy dokładnie słowo, które znajduje się w danym polu. Nie zadziałają tutaj zapytania przedrostowe typu "paral*". Wyniki za każdym razem dostępne będą w tablicy dostępnej pod
hits.hits. Pełny dokument zwracany jest w polu
_source. Pobieranie tak zagnieżdżonych informacji wydaje się niewygodne, a czasami także niepotrzebnie przesyłany jest cały duży dokument, dlatego możemy podać, które pola nas interesują.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 92
{
"fields" : ["title","author"],
"query" : {
"term" : { "title" : "parallel" }
}
}
W rezultacie otrzymamy:
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 797
{
"took" : 9,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.095891505,
"hits" : [ {
"_index" : "books",
"_type" : "book",
"_id" : "1",
"_score" : 0.095891505,
"fields" : {
"title" : "Parallel Worlds: A Journey Through Creation, Higher Dimensions, and the Future of the Cosmos",
"author" : "Michio Kaku"
}
}, {
"_index" : "books",
"_type" : "book",
"_id" : "3",
"_score" : 0.095891505,
"fields" : {
"title" : "Hyperspace: A Scientific Odyssey Through Parallel Universes, Time Warps, and the Tenth Dimension",
"author" : "Michio Kaku"
}
} ]
}
}
Odpytywać można także tylko indeks (bez podawania typu book) oraz wiele indeksów lub wiele typów. Na przykład:
http://localhost:9200/books,books5/book/_search?q=author:kaku&pretty=true
Terms Query
Podajemy kilka wartości, które nie będą analizowane (muszą to być dokładne wartości), oraz opcjonalnie ile z nich musi pasować, aby zwrócony został dany dokument.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 111
{
"query" : {
"terms" : { "title" : ["parallel","hyperspace","worlds"],
"minimum_match" : 2
}
}
}
Match Query
W tym zapytaniu podane wyrażenie zostaje przetworzone przez analizator. A zatem tym razem możemy podawać niepełne wyrazy, na przykład:
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 65
{
"query" : {
"match" : { "title" :"para worlds"
}
}
}
Zapytanie takie zwróci wyniki. Domyślnie słowa są łączone operatorem OR, można to zmienić w następujący sposób.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 122
{
"query" : {
"match" : {
"title" : {
"query" : "parallel worlds",
"operator" : "and"
}
}
}
}
Match Phrase
Jeżeli chcemy wyszukać frazy składającej się z większej ilości słów, korzystamy z
match_phrase, gdzie parametr
slop definiuje, ile nieznanych słów może się mieścić pomiędzy podanymi wyrazami.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 121
{
"query" : {
"match_phrase" : {
"title" : {
"query" : "parallel worlds",
"slop" : 1
}
}
}
}
Multi Match
Efekt zapytania typu "Match" możemy uzyskać także na wielu polach dokumentu.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 131
{
"query" : {
"multi_match" : {
"query" : "univers michio penrose",
"fields" : [ "title", "author" ]
}
}
}
Identifiers Query
Kiedy dokładnie znamy identyfikatory dokumentów, które chcemy pobrać, korzystamy z tego typu zapytania.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 73
{
"query" : {
"ids" : {
"values" : [ "1", "4", "5" ]
}
}
}
Prefix Query
Wyszukiwanie po przedrostkach.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 63
{
"query" : {
"prefix" : {
"title" : "uni"
}
}
}
Fuzzy Like This Query
Zapytanie, które dopuszcza literówki w podanej frazie.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 115
{
"query" : {
"fuzzy_like_this" : {
"fields" : ["title", "author"],
"like_text" : "penrse"
}
}
}
Range Query
Podajemy zakresy, przydatne dla wartości numerycznych.
POST http://localhost:9200/books/book/_search?pretty=true HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 100
{
"query" : {
"range" : {
"year" : {
"from" : 1990,
"to" : 2000
}
}
}
}