시작하세요! 엘라스틱서치을 정리한 내용입니다.
관계형 DB | 엘라스틱서치 |
---|---|
데이터베이스(Database) | 인덱스(index) |
테이블(Table) | 타입(Type) |
행(Row) | 도큐먼트(Document) |
열(Column) | 필드(Field) |
스키마(Schema) | 매핑(Mapping) |
엘라스틱서치의 검색 기능은 질의(query) 명령어를 이용해 수행된다. 질의는 REST API에 문자열 형식의 매개변수를 이용한 URI 방식과 http 데이터를 이용항 리퀘스트 바디 방식이 있다. 질의는 타입, 인덱스 그리고 여러 개의 인덱스를 묶어서 멀티 인덱스 범위로 징의를 할 수 있다. 여러 인덱스를 묶어서 처리하는 엘라스틱서치 기능을 멀티 테넌시라고 한다.
엘라스틱서치에서의 검색은 인덱스 또는 타입 단위로 수행된다. 도큐컨트는 그 자체가 1개의 최소 데이터 단위이므로 도큐먼트 단위로 검색한다는 것은 성립되지 않는다. 다음은 books 인덱스의 book 타입에서 hamlet 이라는 검색어로 검색을 수행한 결과다. 검색은 _search API를 사용하며 질의는 q 매개변수의 값으로 입력한다.
GET http://124.80.103.104:9200/books/book/_search?q=hamlet&pretty=
HTTP/1.1 200 OK
Warning: 299 Elasticsearch-7.6.2-ef48eb35cf30adf4db14086e8aabd07ef6fb113f "[types removal] Specifying types in search requests is deprecated."
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 4.278328,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "UfWG6HoBojKvbC6bnmqj",
"_score": 4.278328,
"_source": {
"title": "Hamlet",
"author": "William Shakespeare",
"category": "Tragedies",
"written": "1599-06-01T12:34:00",
"pages": 172,
"sell": 146100000,
"plot": "The protagonist of Hamlet is Prince Hamlet of Denmark, son of the recently deceased King Hamlet, and nephew of King Claudius, his father's brother and successor. Claudius hastily married King Hamlet's widow, Gertrude, Hamlet's mother. Denmark has a long-standing feud with neighbouring Norway, and an invasion led by the Norwegian prince, Fortinbras, is expected."
}
}
]
}
}
Response code: 200 (OK); Time: 47ms; Content length: 1035 bytes
books 인덱스, book 타입 단위에서 검색어 hamlet으로 검색한 결과가 출력됐다. 검색 결과는 hits 필드에 배열로 표시된다. 타입을 생략하고 books 인덱스 단위로도 검색 가능하다
GET http://124.80.103.104:9200/books/_search?q=hamlet&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 4.278328,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "UfWG6HoBojKvbC6bnmqj",
"_score": 4.278328,
"_source": {
"title": "Hamlet",
"author": "William Shakespeare",
"category": "Tragedies",
"written": "1599-06-01T12:34:00",
"pages": 172,
"sell": 146100000,
"plot": "The protagonist of Hamlet is Prince Hamlet of Denmark, son of the recently deceased King Hamlet, and nephew of King Claudius, his father's brother and successor. Claudius hastily married King Hamlet's widow, Gertrude, Hamlet's mother. Denmark has a long-standing feud with neighbouring Norway, and an invasion led by the Norwegian prince, Fortinbras, is expected."
}
}
]
}
}
Response code: 200 (OK); Time: 28ms; Content length: 1035 bytes
검색 결과 took: 4
는 검색에 소요된 시간으로 ms 단위로 출력된다. 즉 0.004초가 걸렸다는 말이다.
엘라스틱서치의 특징 중 멀티 테넌시가 있다. 이는 여러 인덱스를 동시에 검색하는 기능이다. 사용 방법은 검색할 인덱스를 쉼표 ,
으로 구분해서 입력하면 된다. 이번에는 books,magazines 인덱스에서 검색어 time으로 동시에 검색을 수행해보겠다.
GET http://124.80.103.104:9200/books,magazines/_search?q=time&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
},
{
"_index": "books",
"_type": "book",
"_id": "W_WG6HoBojKvbC6bnmqj",
"_score": 1.9426696,
"_source": {
"title": "Around the World in Eighty Days",
"author": "Jules Verne",
"category": "adventure novel",
"written": "1873-07-01T10:30:00",
"pages": 189,
"sell": 27200000,
"plot": "Fogg and Passepartout reach Suez in time. While disembarking in Egypt, they are watched by a Scotland Yard detective named Fix, who has been dispatched from London in search of a bank robber. Because Fogg matches the description of the robber, Fix mistakes Fogg for the criminal. Since he cannot secure a warrant in time, Fix boards the steamer conveying the travellers to Bombay. Fix becomes acquainted with Passepartout without revealing his purpose. Fogg promises the steamer engineer a large reward if he gets them to Bombay early. They dock two days ahead of schedule."
}
},
{
"_index": "books",
"_type": "book",
"_id": "WfWG6HoBojKvbC6bnmqj",
"_score": 1.5109229,
"_source": {
"title": "Twenty Thousand Leagues Under the Sea",
"author": "Jules Verne",
"category": [
"Science fiction",
"adventure novel"
],
"written": "1870-06-01T10:34:00",
"pages": 304,
"sell": 78100000,
"plot": "In the year 1866, ships of several nations spot a mysterious sea monster, which some suggest to be a giant narwhal. The United States government assembles an expedition in New York City to find and destroy the monster. Professor Pierre Aronnax, a French marine biologist and narrator of the story, who happens to be in New York at the time, receives a last-minute invitation to join the expedition which he accepts. Canadian master harpoonist Ned Land and Aronnax's faithful servant Conseil are also brought aboard."
}
},
{
"_index": "books",
"_type": "book",
"_id": "WPWG6HoBojKvbC6bnmqj",
"_score": 1.2768264,
"_source": {
"title": "The Invisible Man",
"author": "H. G. Wells",
"category": [
"Horror",
"Science fiction novel"
],
"written": "1897-05-01T07:32:00",
"pages": 210,
"sell": 67800000,
"plot": "A mysterious stranger, Griffin, arrives at the local inn of the English village of Iping, West Sussex, during a snowstorm. The stranger wears a long-sleeved, thick coat and gloves, his face hidden entirely by bandages except for a fake pink nose, and a wide-brimmed hat. He is excessively reclusive, irascible, and unfriendly. He demands to be left alone and spends most of his time in his rooms working with a set of chemicals and laboratory apparatus, only venturing out at night. While staying at the inn, hundreds of strange glass bottles arrive that Griffin calls his luggage. Many local townspeople believe this to be very strange. He becomes the talk of the village (one of the novel's most charming aspects is its portrayal of small-town life in southern England, which the author knew from first-hand experience)."
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728,
"_source": {
"title": "Time",
"company": "Time Inc.",
"category": "News magazine",
"issue": "2014-03-01T00:00:00"
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XvWH6HoBojKvbC6bXWqO",
"_score": 0.6931471,
"_source": {
"title": "People",
"company": "Time Inc.",
"category": "Human interest",
"issue": "2013-10-01T00:00:00"
}
}
]
}
}
Response code: 200 (OK); Time: 43ms; Content length: 5171 bytes
total: 6
은 총 6건 데이터가 검색됐음을 뜻한다. books 인덱스의 title: The Time Machine과 magazines
의 title: Time
등의 검색 결과를 확인할 수 있다. 필드 또한 마찬가지러 쉼표로 구분해서 여러 개의 필드를 동시어 갬색할 수 있다.
클러스터의 모든 인덱스에서 검색 하기 위해 _all을 사용할 수도 있다. 또는 인덱스 자체를 생략해도 된다. 하지만 전체 클러스터 검색은 성능을 저하시키고 의도하지 않은 데이터가 검색되는 등 검색 결과의 오염이 발생할 수 있으므로 될 수 있으면 사용하지 않는 것을 권장한다. 다음은 전체 클러스터에서 time을 검색한 결과다.
GET http://124.80.103.104:9200/_all/_search?q=time&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 60,
"relation": "eq"
},
...
}
}
엘라스틱서치의 두 가지 주요 검색 방법 중 먼저 URI를 살펴보겠다. URI 검색은 http 주소에 검색할 명령을 매개변수 형식으로 포함해서 호출하는 검색이다. 리퀘스트 바디 검색과 비교해서 사용 방법은 간단하지만 복잡한 질의를 입력하기 어려운 단점이 있다. 앞에서 살펴본 _search API에서 살펴본 방식은 URI 검색 방식이다.
q는 질의 명령을 입력하는 가장 기본적인 검색 매개변수다. 특정 필드만 검색하려면 q 매개변수에 필드명 : 질의어
형식으로 값을 입력한다. 다음은 title 필드에거 검색 time을 검색하는 명령이다.
GET http://124.80.103.104:9200/_search?q=title%3Atime&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728,
"_source": {
"title": "Time",
"company": "Time Inc.",
"category": "News magazine",
"issue": "2014-03-01T00:00:00"
}
}
]
}
}
Response code: 200 (OK); Time: 37ms; Content length: 1550 bytes
위에서는 6건으로 검색도ㅒㅆ지만, The Time Machine, Time이 두 건만 검색됐다. 나머지 네 건은 title 필드가 아닌 다른 필드에서 time이 포함됐기 때문이다.
이번에는 title 필에 time, machinee이 동시에 들어간 값을 찾는 명령이다. 조건 명령어는 q 매개변수 AND 또는 OR 값을 공백과 함께 넣어서 지정할 수있다.
GET http://124.80.103.104:9200/_search?q=title%3Atime+AND+machine&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 8,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0ㅅ
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 6.232274,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 6.232274,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
}
]
}
}
Response code: 200 (OK); Time: 40ms; Content length: 1222 bytes
웹 프로그럄에서 호출할 때는 위처럼 호출하지만, 유닉스 curl 명령으로 입력하려면 AND좌우에 들어간 공백을 url 인코딩 형식으로 입력해야 하므로 공백 대신 url 인코딩 값은 %20을 입력해야한다.
q 대신에 df 매개변수를 사용해서 검색할 필드를 지정할 수있다.
GET http://124.80.103.104:9200/_search?q=time&df=title&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728,
"_source": {
"title": "Time",
"company": "Time Inc.",
"category": "News magazine",
"issue": "2014-03-01T00:00:00"
}
}
]
}
}
Response code: 200 (OK); Time: 40ms; Content length: 1550 bytes
조건 명령어를 지정하지 않고 공백으로 질의어를 나누면 기본값인 OR로 인식한다. 다음 두 명령의 결과는 같다
- /_search_q=title OR machine
- /_search_q=title machine
default_operator 매개변수를 이용해서 기본 조건 명령어르 OR에서 AND로 변경할 수 있다.
GET http://124.80.103.104:9200/_search?q=title%3Atime+machine&default_operator=AND&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 6.232274,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 6.232274,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
}
]
}
}
Response code: 200 (OK); Time: 44ms; Content length: 1222 bytes
explain 매개변수를 추가하면 각 검색에 대한 explain을 확인할 수 있다. 점수는 검색에 해당하는 데이터의 정확도를 계산한 값이며, 기본적으로 쩜수가 높을수록 결과 값의 상위에 나타난다.
GET http://124.80.103.104:9200/_search?q=title%3Atime&explain=&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596,
"_source": {
"title": "The Time Machine",
"author": "H. G. Wells",
"category": "Science fiction novel",
"written": "1895-11-01T05:01:00",
"pages": 227,
"sell": 22100000,
"plot": "The book's protagonist is an English scientist and gentleman inventor living in Richmond, Surrey in Victorian England, and identified by a narrator simply as the Time Traveller. The narrator recounts the Traveller's lecture to his weekly dinner guests that time is simply a fourth dimension, and his demonstration of a tabletop model machine for travelling through it. He reveals that he has built a machine capable of carrying a person, and returns at dinner the following week to recount a remarkable tale, becoming the new narrator."
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728,
"_source": {
"title": "Time",
"company": "Time Inc.",
"category": "News magazine",
"issue": "2014-03-01T00:00:00"
}
}
]
}
}
Response code: 200 (OK); Time: 25ms; Content length: 1550 bytes
_source 매개변수 값을 false로 설정하면 검색 결과에서 도큐먼트 내용은 표시하지 않고 전체 hit, source 등의 메타정보만 출력된다.
GET http://124.80.103.104:9200/_search?q=title%3Atime&_source=false&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728
}
]
}
}
Response code: 200 (OK); Time: 30ms; Content length: 559 bytes
fields 매개변수를 사용해서 출력 결과에 표시할 필드를 지정할 수 있다. 표시할 필드를 ,
로 구분해서 입력한다. 다음은 출력 결과에 title, author, category 필드만 표시하도록 한 결과다.
GET http://124.80.103.104:9200/_search?q=title%3Atime&_source=title%2Cauthor%2Ccategory&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 2.5739596,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "V_WG6HoBojKvbC6bnmqj",
"_score": 2.5739596,
"_source": {
"author": "H. G. Wells",
"title": "The Time Machine",
"category": "Science fiction novel"
}
},
{
"_index": "magazines",
"_type": "magazine",
"_id": "XfWH6HoBojKvbC6bXWqO",
"_score": 1.2039728,
"_source": {
"title": "Time",
"category": "News magazine"
}
}
]
}
}
Response code: 200 (OK); Time: 23ms; Content length: 815 bytes
sort 매개변수를 사용해서 검색 결과의 출력 순서를 정할 수 있다. 기본적으로 검색 결과는 점수 (_source) 값을 기준으로 졍렬된다. 정렬할 기준을 변경하려면 sort=필드명
형식으로 지정한다. 기본적으로 오름차순으로 정렬되며, sort=필드명:asc
를 입력해도 같은 결과가 츨력된다. 내림차순으로 정렬 하려면 sort=필드명:desc
를 입력한다. 다음은 books 인덱스에서 author 필드가 jules인 도큐먼트를 pages 필드를 기준으로 오름차순으로 검색한 결과와 내림차순으로 검색한 결과다.
GET http://124.80.103.104:9200/books/_search?q=author%3Ajules&sort=pages&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "W_WG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Around the World in Eighty Days",
"author": "Jules Verne",
"category": "adventure novel",
"written": "1873-07-01T10:30:00",
"pages": 189,
"sell": 27200000,
"plot": "Fogg and Passepartout reach Suez in time. While disembarking in Egypt, they are watched by a Scotland Yard detective named Fix, who has been dispatched from London in search of a bank robber. Because Fogg matches the description of the robber, Fix mistakes Fogg for the criminal. Since he cannot secure a warrant in time, Fix boards the steamer conveying the travellers to Bombay. Fix becomes acquainted with Passepartout without revealing his purpose. Fogg promises the steamer engineer a large reward if he gets them to Bombay early. They dock two days ahead of schedule."
},
"sort": [
189
]
},
{
"_index": "books",
"_type": "book",
"_id": "WvWG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Journey to the Center of the Earth",
"author": "Jules Verne",
"category": [
"Science fiction",
"adventure novel"
],
"written": "1864-07-01T11:30:00",
"pages": 212,
"sell": 42100000,
"plot": "Professor Lidenbrock decides to lock everyone in the house and force himself and the others (Axel, and the maid, Martha) to go without food until he cracks the code. Axel discovers the answer when fanning himself with the deciphered text: Lidenbrock's decipherment was correct, and only needs to be read backwards to reveal sentences written in rough Latin."
},
"sort": [
212
]
},
{
"_index": "books",
"_type": "book",
"_id": "WfWG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Twenty Thousand Leagues Under the Sea",
"author": "Jules Verne",
"category": [
"Science fiction",
"adventure novel"
],
"written": "1870-06-01T10:34:00",
"pages": 304,
"sell": 78100000,
"plot": "In the year 1866, ships of several nations spot a mysterious sea monster, which some suggest to be a giant narwhal. The United States government assembles an expedition in New York City to find and destroy the monster. Professor Pierre Aronnax, a French marine biologist and narrator of the story, who happens to be in New York at the time, receives a last-minute invitation to join the expedition which he accepts. Canadian master harpoonist Ned Land and Aronnax's faithful servant Conseil are also brought aboard."
},
"sort": [
304
]
}
]
}
}
Response code: 200 (OK); Time: 30ms; Content length: 3230 bytes
GET http://124.80.103.104:9200/books/_search?q=author%3Ajules&sort=pages%3Adesc&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": null,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "WfWG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Twenty Thousand Leagues Under the Sea",
"author": "Jules Verne",
"category": [
"Science fiction",
"adventure novel"
],
"written": "1870-06-01T10:34:00",
"pages": 304,
"sell": 78100000,
"plot": "In the year 1866, ships of several nations spot a mysterious sea monster, which some suggest to be a giant narwhal. The United States government assembles an expedition in New York City to find and destroy the monster. Professor Pierre Aronnax, a French marine biologist and narrator of the story, who happens to be in New York at the time, receives a last-minute invitation to join the expedition which he accepts. Canadian master harpoonist Ned Land and Aronnax's faithful servant Conseil are also brought aboard."
},
"sort": [
304
]
},
{
"_index": "books",
"_type": "book",
"_id": "WvWG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Journey to the Center of the Earth",
"author": "Jules Verne",
"category": [
"Science fiction",
"adventure novel"
],
"written": "1864-07-01T11:30:00",
"pages": 212,
"sell": 42100000,
"plot": "Professor Lidenbrock decides to lock everyone in the house and force himself and the others (Axel, and the maid, Martha) to go without food until he cracks the code. Axel discovers the answer when fanning himself with the deciphered text: Lidenbrock's decipherment was correct, and only needs to be read backwards to reveal sentences written in rough Latin."
},
"sort": [
212
]
},
{
"_index": "books",
"_type": "book",
"_id": "W_WG6HoBojKvbC6bnmqj",
"_score": null,
"_source": {
"title": "Around the World in Eighty Days",
"author": "Jules Verne",
"category": "adventure novel",
"written": "1873-07-01T10:30:00",
"pages": 189,
"sell": 27200000,
"plot": "Fogg and Passepartout reach Suez in time. While disembarking in Egypt, they are watched by a Scotland Yard detective named Fix, who has been dispatched from London in search of a bank robber. Because Fogg matches the description of the robber, Fix mistakes Fogg for the criminal. Since he cannot secure a warrant in time, Fix boards the steamer conveying the travellers to Bombay. Fix becomes acquainted with Passepartout without revealing his purpose. Fogg promises the steamer engineer a large reward if he gets them to Bombay early. They dock two days ahead of schedule."
},
"sort": [
189
]
}
]
}
}
Response code: 200 (OK); Time: 28ms; Content length: 3230 bytes
timeout 매개변수로 검색이 수행되는 동안 기다리는 제한 시간을 지정할 수 있다. 지정하지 않으면 제한시간 없이 전체 결과가 나올 때까지 기다린다. 단위는 ms 이며 timeout=3000
으로 지정하면 검색 하고 3초 후에 검색을 강제로 종료하고 검색한 결과를 표시한다. 예를 들어 전체 검색 결과가 100건인데 타임아웃 3초로 지정하고 3초 동안 50건까지만 검색됐다면 100건 중에서 검색된 50건에 대한 결과만 출력 된다.
from 매개변수는 검색된 결과를 몇 번째 값부터 출력할지 지정한다. 지정하지 않으면 기본 값은 0이며 검색 결과에 대한 카운트 역시 0부터 시작한다. 예를 들어 검색 결과로 10건이 검색됐는데 from=3
으로 지정했다면 4번째부터의 도큐먼트만 표시된다. 다음 예제는 from=1
로 지정해서 전체 검색 결과는 3건이지만 2번째 결과부터 표시되게 했다.
GET http://124.80.103.104:9200/books/_search?q=author%3Ajules&_source=title&from=1&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.5597045,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "WvWG6HoBojKvbC6bnmqj",
"_score": 1.5597045,
"_source": {
"title": "Journey to the Center of the Earth"
}
},
{
"_index": "books",
"_type": "book",
"_id": "W_WG6HoBojKvbC6bnmqj",
"_score": 1.5597045,
"_source": {
"title": "Around the World in Eighty Days"
}
}
]
}
}
Response code: 200 (OK); Time: 26ms; Content length: 726 bytes
htis.total.value=3
이지미만 실제 hits는 2개이다.
size 매개변수는 검색된 결과 도큐먼트를 몇 개까지 표시할지 지정한다. 지정하지 않으면 기본값은 10이다. 예를 들어 검색 결과가 1,000개가 나와도 기본적으로 10개 도큐먼트까지 표시된다. 더 많은 도큐먼트를 출력해야 한다면 size 매개변수를 사용해서 조정한다. 주의할 점은 엘라스틱서치가 전송하는 데티어 용량이 제한이 있는 경우 너무 많은 내용의 결과를 출력하려 할 때 오류가 발생할 수 있다. config/elasticsearch.yml
에서 http.max_content_legth
설정을 참고.
from과 size 매개변수를 함께 사용하면 페이지 기능을 구현할 수 있다. from으로 몇 번째 페이지를 출력할지 정하고 size로 페이지에 출력할 결과 수를 정하면 된다.
search_type은 검색을 수행하는 방법을 지정한다. 기본은 query_then_fetch
방식이다. 나머지 방식들은 모두 deprecated
query_then_fetch
: 전체 샤드의 검색, 수행된 후에 결과를 ㅜㄹ력한다. 전체 취합된 결과를 size 매개변수에 지정한 개수만큼 출력한다.query_and_fetch
: 샤드별로 검색되는 대로 결과를 받아 출력한다. size 매개변수에서 지정한 개수만큼 샤드별로 검색하므로 size가 10이고 샤드의 개수가 5라면 전체 출력 결과나는 샤드10개씩 총50개의 도큐먼트가 출력된다.query_and_fetch
는 deprecated, 조회시 예외 발생
dfs_query_then_fetch
: 검색 방식은query_then_fetch
와 같으며 정확한 스코어링을 위해 전체 도큐먼트의 검색어 빈도수(idt)를 먼저 계산한다.dfs_query_and_fetch
: 검색 방식은query_and_fetch
와 같으며 정확한 스코어링을 위해 전체 도큐먼트의 검색어 빈도수(idt)를 먼저 계산한다.dfs_query_and_fetch
는 deprecated, 조회시 예외 발생
count
: 검색된 도큐먼트 정보를 배제하고 전체 hits 수만 출력한다. 속도가 가장 빠르다.count
는 deprecated, 조회시 예외 발생
scan
: scroll과 같이 사용되며 검색 결과를 바로 보여주지 않고 scroll에 저장했다가 _scroll_id를 사용해서 나중에 결과를 출력한다. 검색 방식은query_and_fetch
와 같다.scan
는 deprecated, 조회시 예외 발생
GET http://124.80.103.104:9200/books/_search?size=1&q=author%3AWilliam&search_type=query_then_fetch&_source=title%2Cauthor&pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 0.92442226,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "TfWG6HoBojKvbC6bnmqj",
"_score": 0.92442226,
"_source": {
"author": "William Shakespeare",
"title": "The Tempest"
}
}
]
}
}
Response code: 200 (OK); Time: 27ms; Content length: 522 bytes
엘라스틱서치에서 검색 조건을 JSON 데이터 형식의 질의로 입룍해서 사용할 수 있다. 이러한 방식의 검색을 리퀘스트 바디 검색이라고 하며 URI 검색보다 더 복잡한 형식으로 검색할 수 있다.
리퀘스트 바디 검색은 엘라스틱서치의 질의 언어인 QueryDSL을 사용한다. QueryDSL에는 match, term, range 등 다양한 질의가 있다. QueryDSL은 7장 QueryDSL에서 다시 설명하고 이번 장에서는 리퀘스트 바디 검색에 사용되는 옵션 위주로 설명하겠다. 리퀘스트 검색의 형태는 다음과 같다.
<호스트>:<포트>/<?인덱스>/<?타입>/_search -d'
{
<옵션>: <값>, ...
"query": {
... <질의 문법>...
}
}
다음은 books 인덱스에서 author가 william인 값을 검색하는 내용이다.
POST http://124.80.103.104:9200/books/_search?pretty=
HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 6,
"relation": "eq"
},
"max_score": 0.92442226,
"hits": [
{
"_index": "books",
"_type": "book",
"_id": "TfWG6HoBojKvbC6bnmqj",
"_score": 0.92442226,
"_source": {
"title": "The Tempest",
"author": "William Shakespeare",
"category": "Comedies",
"written": "1610-03-01T11:34:00",
"pages": 62,
"sell": 275600000,
"plot": "Magician Prospero, rightful Duke of Milan, and his daughter, Miranda, have been stranded for twelve years on an island after Prospero's jealous brother Antonio (aided by Alonso, the King of Naples) deposed him and set him adrift with the then-3-year-old Miranda. Gonzalo, the King's counsellor, had secretly supplied their boat with plenty of food, water, clothes and the most-prized books from Prospero's library. Possessing magic powers due to his great learning, Prospero is reluctantly served by a spirit, Ariel, whom Prospero had rescued from a tree in which he had been trapped by the witch Sycorax. Prospero maintains Ariel's loyalty by repeatedly promising to release the \"airy spirit\" from servitude. Sycorax had been banished to the island, and had died before Prospero's arrival. Her son, Caliban, a deformed monster and the only non-spiritual inhabitant before the arrival of Prospero, was initially adopted and raised by him. He taught Prospero how to survive on the island, while Prospero and Miranda taught Caliban religion and their own language. Following Caliban's attempted rape of Miranda, he had been compelled by Prospero to serve as the magician's slave. In slavery, Caliban has come to view Prospero as a usurper and has grown to resent him and his daughter. Prospero and Miranda in turn view Caliban with contempt and disgust."
}
},
...
]
}
}
Response code: 200 (OK); Time: 128ms; Content length: 8444 bytes
URL 검색에서 사용했던 size, from fields 등의 매개변수를 옵션으로 지정할 수 있다. query에서 전체 필드를 검색하려면 필드명에 _all을 입력한다. 다음은 전체 인덱스에서 전체 필드를 대상으로 검색어 time으로 검색한다.
- from: 1 -> 검색된 두번 째 값부터 조회
- size: 2 -> 2ro RKwl epdlxjfmf cnffur
- fields: title, category 필드만 출력 하게 설정
sort 옵션을 사용해서 검색 결과의 출력 순서를 정할 수 있다. 기본적으로 검색 결과의 출력은 _source 값을 기준으로 정렬된다. 배열로 정렬한 필드를 여러 개 지정할 수도 있다.
POST http://124.80.103.104:9200/books/_search?pretty
Content-Type: application/json
{
"_source": [
"title",
"author",
"category",
"pages"
],
"sort": [
{
"category": "desc"
},
"pages",
"title"
],
"query": {
"term": {
"_all": "time"
}
}
}
mode 필드를 이용해 해당 필드의 특정 값을 지정해서 sort에 사용할 수 있다.
- min: 해당 필드의 값중 최소값을 선택한다.
- max: 해당 필드의 값중 최대값을 선택한다.
- avg: 해당 필드의 값의 평균값을 대입한다. 필드 값이 number일 때만 유요하다.
- sum: 해당 필드 값의 합계를 대입한다. 필드 값이 number일 때에만 유효하다.
데이터 값의 카운트. 합계 등 계산하는 다양한 처리 기능이 있다. 다양한 연산을 적용해서 출력하는 기능인 패싯을 제공한다. 하지만 패싯의 단점을 보안하고 더욱 다양한 기능을 제공하는 애그리에션모듈이 추가되면서 패싯 보다는 애그리게이션을 권장하고 있다.
PUT hotels
{
"mappings" : {
"properties" : {
"name" : { "type" : "text" },
"stars" : { "type" : "long" },
"rooms" : { "type" : "long" },
"location" : { "type" : "geo_point" },
"city" : { "type" : "text" },
"address" : { "type" : "text" },
"internet" : { "type" : "boolean" },
"service" : { "type" : "keyword" },
"checkin": { "type" : "date" , "format" : "dateOptionalTime"}
}
}
}
POST http://192.168.0.10:9200/_bulk
Content-Type: application/json
< 6_1_hotels.json
애그리게이션은 패싯이 지원하지 않거나 패싯으로 구현하기에 복잡한 기능을 더 쉽게 사용할 수 있게 개발된 모듈이며, 크게 버킷과 매트릭 애그리게이션으로 구분된다.
버킷 애그리게이션은 주어진 조건에 해당하는 도큐먼트를 버킷 이라는 저장소 단위로 구분해서 담아 새로운 데이터의 집합을 생성한다. filter, missing, terms, rnage, histogram이 버킷 애그리게이션에 속한다. 버킷별로 또 다시 하위 애그리게이션을 통해 버킷에 있는 데이터로 다시 새로운 애그리게이션 연산을 반복해서 수행할 수 있다. 버킷을 이용해 몇 단계의 레벨로 중첩해서 처할 수 있지만, 레벨이 깊어질수록 서버 메모리와 같은 자원의 소비가 많이 늘어 나므로 주의가 필요하다.
메트릭 애그리게이션은 주어진 조건으로 도큐먼트를 계산해서 처리된 결과값을 도출한다. min, max, sum, avg가 매트릭 애그리게이션에 속한다.
{
"aggs" (또는 aggregations) : {
"<애그리게이션 명 1 (사용자가 임의러 부여)>" : {
"<애그리게이션 타입>": {
...<애그리게이션 문법>
}
[, "aggs": {<하위 애그리게이션>}]
}
}
}
엘라스틱서치에서 데이터를 찾고 구분하는 필터는 모두 JSON 형식으로 구현되며 이 문법을 엘라스틱서치 QueryDSL이라 한다. 쿼리와 필터의 차이점은 다음과 같다
- 쿼리는 일반적으로 전문검색(full text search)에 사용되고 필터는 Yes/No 조건의 바이너리 구분에 주로 사용된다.
- 쿼리는 점수가 계산되나 필터는 점수가 계산되지 않는다.
- 쿼리 결과는 캐싱되지 않고 필터 결과는 캐싱된다.
- 상대적으로 쿼리는 응답속도가 느리고 필터는 응답 속도가 빠르다.
쿼리의 사용법은 당므과 같다
"query": {
"<쿼리 타입>": {
<"필드명">: { <질의 문법>}
}
}
<필드명>에 _all를 입력하면 모든 필드에 대해 검색된다.
텀에 관해 알아보기 위해 잠시 형태소 분석에 대해 설명하겠다. books 인덱스의 도큐먼트 중 title이 The Prince and the Pauper인 도큐먼트가 색인될 때 필드 값인 the Prince and the Pauper는 일반적으로 당므과 같은 토큰으로 나눠서 저장된다.
the Prince and the Pauper -> the, prince, and, pauper
모든 대문자는 소문자로 변경되고, 중복되는 단어들, 위의 예제에서는 the와 같은 단어는 중복을 삭제한다. 색일할 때 이아 같은 분석 과정을 거치고 저장된 the, prince, and, pauper와 같은 토칸으로 컴이라고 부른다.
텀 쿼리는 주어진 질의문이 저장된 텀과 정확히 일치하는 내용을 찾는다. 앞에 예제에서 저장된 텀 값인 prince로 검색하면 해당 도큐먼트가 나타나지만, 대문자인 prince로 검새하면 저장된 텀과 다르므로 검색 결과가 나타나지 않는다.
GET books/_search
{
"query": {
"term": {
"title": "prince"
}
}
}
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.0786147,
"hits" : [
{
"_index" : "books",
"_type" : "book",
"_id" : "VPWG6HoBojKvbC6bnmqj",
"_score" : 2.0786147,
"_source" : {
"title" : "The Prince and the Pauper",
"author" : "Mark Twain",
"category" : "Children's literature",
"written" : "1881-08-01T10:34:00",
"pages" : 79,
"sell" : 112100000,
"plot" : """Tom Canty (youngest son of a family living with the dregs of society in Offal Court) has always aspired to a better life, encouraged by the local priest (who has taught him to read and write). Loitering around the palace gates one day, he sees a prince (the Prince of Wales – Edward VI). Tom is nearly caught and beaten by the Royal Guards; however, Edward stops them and invites Tom into his palace chamber. There the two boys get to know one another, fascinated by each other's life and their uncanny resemblance. They decide to switch clothes "temporarily". Edward leaves in a hurry before the boys are caught at their game, snatching up an article of national importance (which the reader later learns is the Great Seal of England). Soon Prince Edward is trying to escape the brutality of Tom's abusive drunken father. Tom, posing as the prince, tries to cope with court customs and manners. His fellow nobles and palace staff think "the prince" has an illness which has caused memory loss and fear he will go mad. They repeatedly ask him about the missing "Great Seal", but he knows nothing about it; however, when Tom is asked to sit in on judgments, his common-sense observations reassure them his mind is sound."""
}
}
]
}
}
GET books/_search
{
"query": {
"term": {
"title": "Prince"
}
}
}
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 0,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
}
}
참고로 데이터 색인(저장)할 때 형태소 분석을 not_analzed로 하면 title 필드 값인 The Prince and the Pauper 문장 전체가 통으로 하나의 텀으로 저장되므로 이 경우에는 검색할 질의문이 대소자까지 모두 정확하게 일치해야 검색 된다.
텀 쿼리로 prince, king과 같이 두 텀을 할 질의문 으로 입력하면 하나의 텀을 찾으므로 현재 저장된 books 인덱스의 데이터에서는 결과가 나오지 않는다. 2개 이상의 텀을 같이 검색하려면 텀즈 쿼리를 이용한다.
2개 이상의 텀을 같이 검색하려면 텀즈 쿼리를 이용한다.
GET books/_search
{
"query": {
"terms": {
"title": ["prince", "king"]
}
}
}
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "books",
"_type" : "book",
"_id" : "UPWG6HoBojKvbC6bnmqj",
"_score" : 1.0,
"_source" : {
"title" : "King Lear",
"author" : "William Shakespeare",
"category" : "Tragedies",
"written" : "1603-05-01T04:36:00",
"pages" : 88,
"sell" : 91300000,
"plot" : """In the first scene the Earl of Gloucester and the Earl of Kent meet and observe that King Lear has awarded equal shares of his realm to the Duke of Cornwall and the Duke of Albany (and even before this the formal division of the next scene has taken place). Then the Earl of Gloucester introduces his illegitimate son Edmund to the Earl of Kent. In the next scene, King Lear, who is elderly and wants to retire from power, decides to divide his realm among his three daughters, and declares he'll offer the largest share to the one who loves him best. The eldest, Goneril, speaks first, declaring her love for her father in fulsome terms. Moved by her flattery Lear proceeds to grant to Goneril her share as soon as she's finished her declaration, before Regan and Cordelia have a chance to speak. He then awards to Regan her share as soon as she has spoken. When it is finally the turn of his youngest daughter, Cordelia, at first she refuses to say anything ("Nothing, my Lord") and then declares there is nothing to compare her love to, nor words to properly express it; she speaks honestly but bluntly, which infuriates him. In his anger he disinherits Cordelia and divides her share between Regan and Goneril. Kent objects to this unfair treatment. Enraged by Kent's protests, Lear banishes him from the country. Lear summons the Duke of Burgundy and the King of France, who have both proposed marriage to Cordelia. Learning that Cordelia has been disinherited, the Duke of Burgundy withdraws his suit, but the King of France is impressed by her honesty and marries her anyway."""
}
},
{
"_index" : "books",
"_type" : "book",
"_id" : "VPWG6HoBojKvbC6bnmqj",
"_score" : 1.0,
"_source" : {
"title" : "The Prince and the Pauper",
"author" : "Mark Twain",
"category" : "Children's literature",
"written" : "1881-08-01T10:34:00",
"pages" : 79,
"sell" : 112100000,
"plot" : """Tom Canty (youngest son of a family living with the dregs of society in Offal Court) has always aspired to a better life, encouraged by the local priest (who has taught him to read and write). Loitering around the palace gates one day, he sees a prince (the Prince of Wales – Edward VI). Tom is nearly caught and beaten by the Royal Guards; however, Edward stops them and invites Tom into his palace chamber. There the two boys get to know one another, fascinated by each other's life and their uncanny resemblance. They decide to switch clothes "temporarily". Edward leaves in a hurry before the boys are caught at their game, snatching up an article of national importance (which the reader later learns is the Great Seal of England). Soon Prince Edward is trying to escape the brutality of Tom's abusive drunken father. Tom, posing as the prince, tries to cope with court customs and manners. His fellow nobles and palace staff think "the prince" has an illness which has caused memory loss and fear he will go mad. They repeatedly ask him about the missing "Great Seal", but he knows nothing about it; however, when Tom is asked to sit in on judgments, his common-sense observations reassure them his mind is sound."""
}
}
]
}
}
매치 쿼리도 텀 쿼리와 마찬가지로 주어진 질의문을 색인된 텀과 비교햐 일치하는 도큐먼트를 검색하는 질의다. 다만 컴 쿼리와 다르게 매치 쿼리에서는 주어진 질의문 또한 형태소 분석을 거친 뒤 분석된 질의문으로 검색을 수행한다.
GET books/_search
{
"query": {
"match": {
"title": "The And"
}
}
}
operator를 사용하면 질의에 사용된 단어에 대한 조건문을 지정할 수 있다. 입력할 수 있는 값은 and, or 이며 기본은 or이다.
GET books/_search
{
"query": {
"match": {
"title": {
"query": "The And",
"operator": "and"
}
}
}
}
불 쿼리는 내부의 질의로 다른 쿼리를 포함시켜 사용한다. 쿼리를 조건문인 불 조합으로 적용해서 최종 검색 결과를 나타낸다. 불 쿼리에 사용할 수 있는 조건문으로는 다음 3가지가 있다.
- must: 이 쿼리에 반드시 해당돼야 한다. AND 조건에 해당
- must_not: 이 쿼리에 해당돼서는 안된다. NOT에 해당
- should: 이 쿼리에 반드시 해당될 필요는 없지만 해당된다면 더 높은 스코어를 가진다. OR조건과 유사하다.
GET books/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"title": "the"
}
}
],
"must_not": [
{
"term": {
"plot": "prince"
}
}
],
"should": [
{ "term": { "title": "time" } },
{ "term": { "title": "time" } }
]
}
}
}
5장 URL 검색에서 q 매개변수에 다양한 질의문을 사용해서 검색을 수행했다. 문자열 쿼리는 URI 검색에서 사용했던 형식의 질의문과 같은 방식으로 사용할 수 있는 쿼리다. AND, OR, ?., *와 같은 다양한 키워드를 제공한다.
GET books/_search
{
"query": {
"query_string": {
"query": "title:prince"
}
}
}
다음은 default_filed로 필드를 plot으로 지정하고 default_operator로 조건문을 and로 지정한 뒤 prince와 king을 검색한 예제다. 즉 plot 필드에 prince, king을 포함하는 모든 도큐먼트를 검색한 결과다.
GET books/_search
{
"query": {
"query_string": {
"default_field": "plot",
"query": "prince king",
"default_operator": "AND"
}
}
}
접듀어 쿼리는 텀 쿼리와 마찬가지로 질의어에 형태소 분석이 적용되지 않으므로 정확한 텀 값을 거려해서 검색해야 한다.
GET books/_search
{
"query": {
"prefix": {
"title": {
"value": "prin"
}
}
}
}
범위 쿼리를 사용해 주어진 범위에 해당하는 필드값이 있는 도큐먼트를 검색할 수 있다.
- gte: 주어진 밗보다 크거나 같다
- gt: 주어진 값보다 크다
- lte: 주어진 값보다 작거나 같다
- lt: 주어진 값보다 작다
GET books/_search
{
"query": {
"range": {
"pages": {
"gte": 50,
"lt": 150
}
}
}
}
범위 쿼리로 값을 비교하는 필드는 숫자 또는 날짜/시간 형식이어야 한다. 날짜/시간은 JOSN 표준 날짜-시간 입력 형식인 yyyy-MM-ddThh:mm:ss.SSS로 입력해야한다.
GET books/_search
{
"query": {
"range": {
"written": {
"gte": "1600-01-01",
"lt": "1699-12-31"
}
}
}
}
전체 매치 쿼리는 별다른 제약 없이 전체 도큐먼트를 가져오는 쿼리다. 보통은 쿠먼트의 카운트와 같은 메타 정보 관리나 필터의 연계해서 사용한다.
GET books/_search
{
"query": {
"match_all": {}
}
}
퍼지 쿼리는 주어진 질의문을 레벤슈타인 거리 알고리즘을 기반으로 유사한 단어를 검색을 지원한다. tree를 입력하면 유사한 단언인 three가 포함된 도큐먼트가 검색 결과로 나타난다.
GET books/_search
{
"query": {
"fuzzy": {
"title": "tree"
}
}
}
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.9304698,
"hits" : [
{
"_index" : "books",
"_type" : "book",
"_id" : "VvWG6HoBojKvbC6bnmqj",
"_score" : 1.9304698,
"_source" : {
"title" : "The Three Musketeers",
"author" : "Alexandre Dumas",
"category" : "Historical novel",
"written" : "1844-10-01T12:00:00",
"pages" : 340,
"sell" : 61400000,
"plot" : "In 1625 France, d'Artagnan—a poor young nobleman—leaves his family in Gascony and travels to Paris with the intention of joining the Musketeers of the Guard. However, en route, at an inn in Meung-sur-Loire, an older man derides d'Artagnan's horse and, feeling insulted, d'Artagnan demands to fight a duel with him. The older man's companions beat d'Artagnan unconscious with a pot and a metal tong that breaks his sword. His letter of introduction to Monsieur de Tréville, the commander of the Musketeers, is stolen. D'Artagnan resolves to avenge himself upon the man, who is later revealed to be the Comte de Rochefort, an agent of Cardinal Richelieu, who is in Meung to pass orders from the Cardinal to Milady de Winter, another of his agents."
}
}
]
}
}
피지 쿼리를 이용하면 숫자, 날짜 형식 필드에 대해 범위 검색으로 응용할 수 있다. 질의 값은 valu 필드를 이요하고 범위 설정은 fuzziness 필드를 이용해 설정한다. 당므은 page 필드의 값 100을 기준으로 +/-20인 범위 도큐먼트를 검색한 결과다.
GET books/_search
{
"query": {
"fuzzy": {
"pages": {
"value": 100,
"fuzziness": 20
}
}
}
}