Elasticsearch๋ Lucene์ ์ฌ์ฉํ๊ณ Java๋ก ์์ฑ๋ JSON REST API๋ฅผ ๊ฐ์ถ ๊ฒ์ ์์ง์ ๋๋ค. ์ด ์์ง์ ๋ชจ๋ ์ฅ์ ์ ๋ํ ์ค๋ช ์ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ ๋ถํฐ Elasticsearch๋ฅผ ES๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
์ด๋ฌํ ์์ง์ ๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ณต์กํ ๊ฒ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ์ด ํํ๋ฅผ ๊ณ ๋ คํ ๊ฒ์์ด๋ ์ง๋ฆฌ ์ขํ๋ฅผ ์ด์ฉํ ๊ฒ์์ด ์์ต๋๋ค.
์ด ๊ธ์์๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ธ๋ฑ์ฑ ์ฌ๋ก๋ฅผ ํตํด ES์ ๊ธฐ๋ณธ ์ฌํญ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ฌธ์๋ฅผ ํํฐ๋ง, ์ ๋ ฌ, ๊ฒ์ํ๋ ๋ฐฉ๋ฒ๋ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด์ ์ฒด์ ์ ์์กดํ์ง ์๊ธฐ ์ํด ๋ชจ๋ ์์ฒญ์ CURL์ ์ฌ์ฉํ์ฌ ES์ ์ ๋ฌํ๊ฒ ์ต๋๋ค. Google Chrome์ฉ ํ๋ฌ๊ทธ์ธ๋ ์์ต๋๋ค. .
๋ณธ๋ฌธ ์ ์ฒด์ ๊ฑธ์ณ ๋ฌธ์ ๋ฐ ๊ธฐํ ์ถ์ฒ์ ๋ํ ๋งํฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ๋ง์ง๋ง์๋ ๋ฌธ์์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ ๋งํฌ๊ฐ ์์ต๋๋ค. ์ต์ํ์ง ์์ ์ฉ์ด์ ์ ์๋ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค. .
ES ์ค์น
์ด๋ฅผ ์ํด์๋ ๋จผ์ Java๊ฐ ํ์ํฉ๋๋ค. ๊ฐ๋ฐ์ Java 8 ์ ๋ฐ์ดํธ 20 ๋๋ Java 7 ์ ๋ฐ์ดํธ 55๋ณด๋ค ์ต์ Java ๋ฒ์ ์ ์ค์นํ์ธ์.
ES ๋ฐฐํฌ๋ ๋ค์์์ ๊ฐ๋ฅํฉ๋๋ค. . ์์นด์ด๋ธ๋ฅผ ์์ถ ํด์ ํ ํ ๋ค์์ ์คํํด์ผ ํฉ๋๋ค. bin/elasticsearch. ๋ํ ์ฌ์ฉ ๊ฐ๋ฅ . ์๋ค . .
์ค์น ๋ฐ ์คํ ํ ๊ธฐ๋ฅ์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
# ะดะปั ัะดะพะฑััะฒะฐ ะทะฐะฟะพะผะฝะธะผ ะฐะดัะตั ะฒ ะฟะตัะตะผะตะฝะฝัั
#export ES_URL=$(docker-machine ip dev):9200
export ES_URL=localhost:9200
curl -X GET $ES_URL๋ค์๊ณผ ๊ฐ์ ๋ต๋ณ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
{
"name" : "Heimdall",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.2.1",
"build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
"build_timestamp" : "2016-03-09T09:38:54Z",
"build_snapshot" : false,
"lucene_version" : "5.4.1"
},
"tagline" : "You Know, for Search"
}์ธ๋ฑ์ฑ
ES์ ๊ฒ์๋ฌผ์ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
# ะะพะฑะฐะฒะธะผ ะดะพะบัะผะตะฝั c id 1 ัะธะฟะฐ post ะฒ ะธะฝะดะตะบั blog.
# ?pretty ัะบะฐะทัะฒะฐะตั, ััะพ ะฒัะฒะพะด ะดะพะปะถะตะฝ ะฑััั ัะตะปะพะฒะตะบะพ-ัะธัะฐะตะผัะผ.
curl -XPUT "$ES_URL/blog/post/1?pretty" -d'
{
"title": "ะะตัะตะปัะต ะบะพัััะฐ",
"content": "<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ะบะพััั<p>",
"tags": [
"ะบะพัััะฐ",
"ัะผะตัะฝะฐั ะธััะพัะธั"
],
"published_at": "2014-09-12T20:44:42+00:00"
}'
์๋ฒ ์๋ต:
{
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_version" : 1,
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"created" : false
}
ES๊ฐ ์๋์ผ๋ก ์์ฑ๋จ ๋ธ๋ก๊ทธ์ ๊ฒ์๋ฌผ์ ๋๋ค. ์กฐ๊ฑด๋ถ ๋น์ ๋ฅผ ๋ค ์ ์์ต๋๋ค. ์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๊ณ , ํ์ ์ ์ด DB์ ํ ์ด๋ธ์ ๋๋ค. ๊ฐ ํ์ ์ ๊ณ ์ ํ ์คํค๋ง๋ฅผ ๊ฐ์ต๋๋ค. ๊ด๊ณํ ํ ์ด๋ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ฌธ์๊ฐ ์ธ๋ฑ์ฑ๋๋ฉด ๋งคํ์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.
# ะะพะปััะธะผ mapping ะฒัะตั
ัะธะฟะพะฒ ะธะฝะดะตะบัะฐ blog
curl -XGET "$ES_URL/blog/_mapping?pretty"์๋ฒ ์๋ต์์ ์ฃผ์์ ์ธ๋ฑ์ฑ๋ ๋ฌธ์ ํ๋ ๊ฐ์ ์ถ๊ฐํ์ต๋๋ค.
{
"blog" : {
"mappings" : {
"post" : {
"properties" : {
/* "content": "<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ะบะพััั<p>", */
"content" : {
"type" : "string"
},
/* "published_at": "2014-09-12T20:44:42+00:00" */
"published_at" : {
"type" : "date",
"format" : "strict_date_optional_time||epoch_millis"
},
/* "tags": ["ะบะพัััะฐ", "ัะผะตัะฝะฐั ะธััะพัะธั"] */
"tags" : {
"type" : "string"
},
/* "title": "ะะตัะตะปัะต ะบะพัััะฐ" */
"title" : {
"type" : "string"
}
}
}
}
}
}ES๋ ๋จ์ผ ๊ฐ๊ณผ ๊ฐ ๋ฐฐ์ด์ ๊ตฌ๋ถํ์ง ์๋๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, title ํ๋์๋ ์ ๋ชฉ๋ง ํฌํจ๋๊ณ , tags ํ๋์๋ ๋ฌธ์์ด ๋ฐฐ์ด์ด ํฌํจ๋์ง๋ง, ๋งคํ์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ํํ๋ฉ๋๋ค.
๋งคํ์ ๋ํด์๋ ๋์ค์ ๋ ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
์์ฒญ
ID๋ก ๋ฌธ์ ์ถ์ถ:
# ะธะทะฒะปะตัะตะผ ะดะพะบัะผะตะฝั ั id 1 ัะธะฟะฐ post ะธะท ะธะฝะดะตะบัะฐ blog
curl -XGET "$ES_URL/blog/post/1?pretty"{
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"title" : "ะะตัะตะปัะต ะบะพัััะฐ",
"content" : "<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ะบะพััั<p>",
"tags" : [ "ะบะพัััะฐ", "ัะผะตัะฝะฐั ะธััะพัะธั" ],
"published_at" : "2014-09-12T20:44:42+00:00"
}
}๋ต๋ณ์ ์๋ก์ด ํค๊ฐ ๋ํ๋ฌ์ต๋๋ค: _version ะธ _source์ผ๋ฐ์ ์ผ๋ก .๋ก ์์ํ๋ ๋ชจ๋ ํค _ ์๋น์ค ํ๋ชฉ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
์ด์ _version ๋ฌธ์ ๋ฒ์ ์ ๋ณด์ฌ์ค๋๋ค. ๋๊ด์ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ด ์๋ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฒ์ 1์ ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํฉ๋๋ค. ๋ณ๊ฒฝ๋ ๋ฌธ์๋ฅผ ์ ์กํ๊ณ ๋ฒ์ 1์ ๋ฌธ์์ ๋ํ ํธ์ง์์ ํ์ํฉ๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ๋ฒ์ 1์ ๋ฌธ์๋ฅผ ํธ์งํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์กํ ๊ฒฝ์ฐ, ES๋ ํด๋น ๋ฌธ์๋ฅผ ๋ฒ์ 2๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๋ฝํ์ง ์์ต๋๋ค.
์ด์ _source ์ธ๋ฑ์ฑํ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ES๋ ๊ฒ์ ์์
์ ์ด ๊ฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ธ๋ฑ์ค๋ ๊ฒ์์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ES๋ ๊ณต๊ฐ ์ ์ฝ์ ์ํด ์์ถ๋ ์์ค ๋ฌธ์๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ์ฒด ์์ค ๋ฌธ์๊ฐ ์๋ ID๋ง ํ์ํ ๊ฒฝ์ฐ ์์ค ์ ์ฅ์ ๋นํ์ฑํํ ์ ์์ต๋๋ค.
์ถ๊ฐ ์ ๋ณด๊ฐ ํ์ํ์ง ์์ผ๋ฉด _source์ ๋ด์ฉ๋ง ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
curl -XGET "$ES_URL/blog/post/1/_source?pretty"{
"title" : "ะะตัะตะปัะต ะบะพัััะฐ",
"content" : "<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ะบะพััั<p>",
"tags" : [ "ะบะพัััะฐ", "ัะผะตัะฝะฐั ะธััะพัะธั" ],
"published_at" : "2014-09-12T20:44:42+00:00"
}
ํน์ ํ๋๋ง ์ ํํ ์๋ ์์ต๋๋ค.
# ะธะทะฒะปะตัะตะผ ัะพะปัะบะพ ะฟะพะปะต title
curl -XGET "$ES_URL/blog/post/1?_source=title&pretty"{
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : {
"title" : "ะะตัะตะปัะต ะบะพัััะฐ"
}
}๋ช ๊ฐ์ ๊ฒ์๋ฌผ์ ๋ ์ธ๋ฑ์ฑํ๊ณ ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
curl -XPUT "$ES_URL/blog/post/2" -d'
{
"title": "ะะตัะตะปัะต ัะตะฝะบะธ",
"content": "<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ัะตะฝะบะพะฒ<p>",
"tags": [
"ัะตะฝะบะธ",
"ัะผะตัะฝะฐั ะธััะพัะธั"
],
"published_at": "2014-08-12T20:44:42+00:00"
}'curl -XPUT "$ES_URL/blog/post/3" -d'
{
"title": "ะะฐะบ ั ะผะตะฝั ะฟะพัะฒะธะปัั ะบะพัะตะฝะพะบ",
"content": "<p>ะััะตัะฐะทะดะธัะฐััะฐั ะธััะพัะธั ะฟัะพ ะฑะตะดะฝะพะณะพ ะบะพัะตะฝะบะฐ ั ัะปะธัั<p>",
"tags": [
"ะบะพัััะฐ"
],
"published_at": "2014-07-21T20:44:42+00:00"
}'์ ๋ ฌ
# ะฝะฐะนะดะตะผ ะฟะพัะปะตะดะฝะธะน ะฟะพัั ะฟะพ ะดะฐัะต ะฟัะฑะปะธะบะฐัะธะธ ะธ ะธะทะฒะปะตัะตะผ ะฟะพะปั title ะธ published_at
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
"size": 1,
"_source": ["title", "published_at"],
"sort": [{"published_at": "desc"}]
}'{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : null,
"hits" : [ {
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_score" : null,
"_source" : {
"title" : "ะะตัะตะปัะต ะบะพัััะฐ",
"published_at" : "2014-09-12T20:44:42+00:00"
},
"sort" : [ 1410554682000 ]
} ]
}
}์ฐ๋ฆฌ๋ ๋ง์ง๋ง ๊ฒ์๋ฌผ์ ์ ํํ์ต๋๋ค. size ๋ฐ๊ธ๋๋ ๋ฌธ์์ ์๋ฅผ ์ ํํฉ๋๋ค. total ์ฟผ๋ฆฌ์ ์ผ์นํ๋ ๋ฌธ์์ ์ด ๊ฐ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. sort ์ถ๋ ฅ์๋ ์ ๋ ฌ์ ์ฌ์ฉ๋๋ ์ ์ ๋ฐฐ์ด์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ฆ, ๋ ์ง๊ฐ ์ ์๋ก ๋ณํ๋์์ต๋๋ค. ์ ๋ ฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ค์์์ ํ์ธํ ์ ์์ต๋๋ค. .
ํํฐ ๋ฐ ์ฟผ๋ฆฌ
ES ๋ฒ์ 2๋ถํฐ๋ ํํฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. .
์ฟผ๋ฆฌ ์ปจํ
์คํธ๋ ํํฐ ์ปจํ
์คํธ์ ๋ค๋ฆ
๋๋ค. ์ฟผ๋ฆฌ๊ฐ _score๋ฅผ ์์ฑํ๊ณ ์บ์๋์ง ์์ต๋๋ค. _score๊ฐ ๋ฌด์์ธ์ง๋ ๋์ค์ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
๋ ์ง๋ณ๋ก ํํฐ๋ง
์ฐ๋ฆฌ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค ํํฐ์ ๋งฅ๋ฝ์์:
# ะฟะพะปััะธะผ ะฟะพััั, ะพะฟัะฑะปะธะบะพะฒะฐะฝะฝัะต 1ะพะณะพ ัะตะฝััะฑัั ะธะปะธ ะฟะพะทะถะต
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
"filter": {
"range": {
"published_at": { "gte": "2014-09-01" }
}
}
}'ํ๊ทธ๋ก ํํฐ๋ง
์ฐ๋ฆฌ๋ ์ฌ์ฉ ์ฃผ์ด์ง ๋จ์ด๊ฐ ํฌํจ๋ ๋ฌธ์ ID๋ฅผ ๊ฒ์ํ๋ ค๋ฉด:
# ะฝะฐะนะดะตะผ ะฒัะต ะดะพะบัะผะตะฝัั, ะฒ ะฟะพะปะต tags ะบะพัะพััั
ะตััั ัะปะตะผะตะฝั 'ะบะพัััะฐ'
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
"_source": [
"title",
"tags"
],
"filter": {
"term": {
"tags": "ะบะพัััะฐ"
}
}
}'{
"took" : 9,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.0,
"hits" : [ {
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "ะะตัะตะปัะต ะบะพัััะฐ",
"tags" : [ "ะบะพัััะฐ", "ัะผะตัะฝะฐั ะธััะพัะธั" ]
}
}, {
"_index" : "blog",
"_type" : "post",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"title" : "ะะฐะบ ั ะผะตะฝั ะฟะพัะฒะธะปัั ะบะพัะตะฝะพะบ",
"tags" : [ "ะบะพัััะฐ" ]
}
} ]
}
}์ ์ฒด ํ ์คํธ ๊ฒ์
์ธ ๊ฐ์ ๋ฌธ์์๋ ์ฝํ ์ธ ํ๋์ ๋ค์ ๋ด์ฉ์ด ํฌํจ๋์ด ์์ต๋๋ค.
<p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ะบะพััั<p><p>ะกะผะตัะฝะฐั ะธััะพัะธั ะฟัะพ ัะตะฝะบะพะฒ<p><p>ะััะตัะฐะทะดะธัะฐััะฐั ะธััะพัะธั ะฟัะพ ะฑะตะดะฝะพะณะพ ะบะพัะตะฝะบะฐ ั ัะปะธัั<p>
์ฐ๋ฆฌ๋ ์ฌ์ฉ ์ฃผ์ด์ง ๋จ์ด๊ฐ ํฌํจ๋ ๋ฌธ์ ID๋ฅผ ๊ฒ์ํ๋ ค๋ฉด:
# source: false ะพะทะฝะฐัะฐะตั, ััะพ ะฝะต ะฝัะถะฝะพ ะธะทะฒะปะตะบะฐัั _source ะฝะฐะนะดะตะฝะฝัั
ะดะพะบัะผะตะฝัะพะฒ
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
"_source": false,
"query": {
"match": {
"content": "ะธััะพัะธั"
}
}
}'{
"took" : 13,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 3,
"max_score" : 0.11506981,
"hits" : [ {
"_index" : "blog",
"_type" : "post",
"_id" : "2",
"_score" : 0.11506981
}, {
"_index" : "blog",
"_type" : "post",
"_id" : "1",
"_score" : 0.11506981
}, {
"_index" : "blog",
"_type" : "post",
"_id" : "3",
"_score" : 0.095891505
} ]
}
}ํ์ง๋ง ์ฝํ ์ธ ํ๋์์ "stories"๋ฅผ ๊ฒ์ํด๋ ์๋ฌด๊ฒ๋ ์ฐพ์ ์ ์์ต๋๋ค. ์์ธ์๋ ์ด๊ทผ์ด ์๋ ์์ด๋ง ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์ง์ ๊ฒ์์ ์ํด์๋ ๋ถ์๊ธฐ๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๋ถ์ผ _score ์ผ ์ฟผ๋ฆฌ๊ฐ ํํฐ ์ปจํ
์คํธ์์ ์คํ๋๋ ๊ฒฝ์ฐ _score ๊ฐ์ ํญ์ 1์ด ๋๋ฉฐ, ์ด๋ ํํฐ๋ฅผ ์๋ฒฝํ๊ฒ ์ค์ํจ์ ์๋ฏธํฉ๋๋ค.
๋ถ์๊ธฐ
์์ค ํ
์คํธ๋ฅผ ํ ํฐ ์งํฉ์ผ๋ก ๋ณํํ๋ ๋ฐ ํ์ํฉ๋๋ค.
๋ถ์๊ธฐ๋ ํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ . ํ ํฌ๋์ด์ ๋ ์ฌ๋ฌ ๊ฐ๋ก ์์๋ ์ ์์ต๋๋ค. ํ ํฌ๋์ด์ ๋ ๊ณต๋ฐฑ์ด๋ ๊ตฌ๋์ ๊ธฐํธ ๋ฑ์ ์ฌ์ฉํ์ฌ ์๋ณธ ๋ฌธ์์ด์ ํ ํฐ์ผ๋ก ๋ถํ ํฉ๋๋ค. ํ ํฐํํฐ๋ ํ ํฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋, ํ ํฐ์ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋จ์ด ์ด๊ฐ๋ง ๋จ๊ธฐ๊ฑฐ๋, ์ ์น์ฌ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋, ๋์์ด๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ฌธ์ํํฐ๋ ์๋ณธ ๋ฌธ์์ด์ ์์ ํ ๋ณ๊ฒฝํฉ๋๋ค. ์๋ฅผ ๋ค์ด, HTML ํ๊ทธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
ES์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค ์๋ฅผ ๋ค์ด, ๋ถ์๊ธฐ .
์ฌ์ฉํ์ ์ด์ ํ์ค ๋ฐ ๋ฌ์์์ด ๋ถ์๊ธฐ๊ฐ "๊ณ ์์ด์ ๊ดํ ์ฌ๋ฏธ์๋ ์ด์ผ๊ธฐ" ๋ฌธ์์ด์ ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
# ะธัะฟะพะปัะทัะตะผ ะฐะฝะฐะปะธะทะฐัะพั standard
# ะพะฑัะทะฐัะตะปัะฝะพ ะฝัะถะฝะพ ะฟะตัะตะบะพะดะธัะพะฒะฐัั ะฝะต ASCII ัะธะผะฒะพะปั
curl -XGET "$ES_URL/_analyze?pretty&analyzer=standard&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"{
"tokens" : [ {
"token" : "ะฒะตัะตะปัะต",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 0
}, {
"token" : "ะธััะพัะธะธ",
"start_offset" : 8,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "ะฟัะพ",
"start_offset" : 16,
"end_offset" : 19,
"type" : "<ALPHANUM>",
"position" : 2
}, {
"token" : "ะบะพััั",
"start_offset" : 20,
"end_offset" : 25,
"type" : "<ALPHANUM>",
"position" : 3
} ]
}# ะธัะฟะพะปัะทัะตะผ ะฐะฝะฐะปะธะทะฐัะพั russian
curl -XGET "$ES_URL/_analyze?pretty&analyzer=russian&text=%D0%92%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%B8%D1%81%D1%82%D0%BE%D1%80%D0%B8%D0%B8%20%D0%BF%D1%80%D0%BE%20%D0%BA%D0%BE%D1%82%D1%8F%D1%82"{
"tokens" : [ {
"token" : "ะฒะตัะตะป",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 0
}, {
"token" : "ะธััะพั",
"start_offset" : 8,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "ะบะพั",
"start_offset" : 20,
"end_offset" : 25,
"type" : "<ALPHANUM>",
"position" : 3
} ]
}ํ์ค ๋ถ์๊ธฐ๋ ๊ณต๋ฐฑ์ผ๋ก ์ค์ ๋๋๊ณ ๋ชจ๋ ๋จ์ด๋ฅผ ์๋ฌธ์๋ก ๋ณํํ์ง๋ง, ๋ฌ์์์ด ๋ถ์๊ธฐ๋ ์ค์ํ์ง ์์ ๋จ์ด๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ฌธ์๋ก ๋ณํํ๊ณ ๋จ์ด์ ์ด๊ฐ์ ๊ทธ๋๋ก ๋์์ต๋๋ค.
๋ฌ์์ ๋ถ์๊ธฐ๊ฐ ์ฌ์ฉํ๋ Tokenizer, TokenFilters, CharFilters๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
{
"filter": {
"russian_stop": {
"type": "stop",
"stopwords": "_russian_"
},
"russian_keywords": {
"type": "keyword_marker",
"keywords": []
},
"russian_stemmer": {
"type": "stemmer",
"language": "russian"
}
},
"analyzer": {
"russian": {
"tokenizer": "standard",
/* TokenFilters */
"filter": [
"lowercase",
"russian_stop",
"russian_keywords",
"russian_stemmer"
]
/* CharFilters ะพััััััะฒััั */
}
}
}HTML ํ๊ทธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฌ์์์ด ๊ธฐ๋ฐ ๋ถ์๊ธฐ๋ฅผ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ถ์๊ธฐ๋ฅผ '๊ธฐ๋ณธ๊ฐ'์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. ์ด ์ด๋ฆ์ ๋ถ์๊ธฐ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
{
"filter": {
"ru_stop": {
"type": "stop",
"stopwords": "_russian_"
},
"ru_stemmer": {
"type": "stemmer",
"language": "russian"
}
},
"analyzer": {
"default": {
/* ะดะพะฑะฐะฒะปัะตะผ ัะดะฐะปะตะฝะธะต html ัะตะณะพะฒ */
"char_filter": ["html_strip"],
"tokenizer": "standard",
"filter": [
"lowercase",
"ru_stop",
"ru_stemmer"
]
}
}
}๋จผ์ , ์๋ ๋ฌธ์์ด์์ ๋ชจ๋ HTML ํ๊ทธ๋ฅผ ์ ๊ฑฐํ ๋ค์ ํ ํฌ๋์ด์ ํ์ค์ ์ฌ์ฉํ์ฌ ํ ํฐ์ผ๋ก ๋ถํ ํ๊ณ , ๋ถํ ๋ ํ ํฐ์ ์๋ฌธ์๋ก ๋ณํํ๊ณ , ์ค์ํ์ง ์์ ๋จ์ด๋ ์ ๊ฑฐํ๊ณ , ๋จ์ ํ ํฐ์ ๋จ์ด์ ์ด๊ฐ์ด ๋ฉ๋๋ค.
์ธ๋ฑ์ค ์์ฑ
์์์ ๊ธฐ๋ณธ ๋ถ์๊ธฐ๋ฅผ ์ค๋ช ํ์ต๋๋ค. ์ด ๋ถ์๊ธฐ๋ ๋ชจ๋ ๋ฌธ์์ด ํ๋์ ์ ์ฉ๋ฉ๋๋ค. ๊ฒ์๋ฌผ์๋ ํ๊ทธ ๋ฐฐ์ด์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ํ๊ทธ๋ ๋ถ์๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ํ๊ทธ์ ์ ํํ ์ผ์นํ๋ ๊ฒ์๋ฌผ์ ์ฐพ๊ณ ์์ผ๋ฏ๋ก ํ๊ทธ ํ๋์ ๋ํ ๋ถ์์ ๋นํ์ฑํํด์ผ ํฉ๋๋ค.
ํ๊ทธ ํ๋ ๋ถ์์ด ๋นํ์ฑํ๋ ๋ถ์๊ธฐ์ ๋งคํ์ ์ฌ์ฉํ์ฌ blog2 ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
curl -XPOST "$ES_URL/blog2" -d'
{
"settings": {
"analysis": {
"filter": {
"ru_stop": {
"type": "stop",
"stopwords": "_russian_"
},
"ru_stemmer": {
"type": "stemmer",
"language": "russian"
}
},
"analyzer": {
"default": {
"char_filter": [
"html_strip"
],
"tokenizer": "standard",
"filter": [
"lowercase",
"ru_stop",
"ru_stemmer"
]
}
}
}
},
"mappings": {
"post": {
"properties": {
"content": {
"type": "string"
},
"published_at": {
"type": "date"
},
"tags": {
"type": "string",
"index": "not_analyzed"
},
"title": {
"type": "string"
}
}
}
}
}'์ด ์ธ๋ฑ์ค(blog3)์๋ ๊ฐ์ ๊ฒ์๋ฌผ 2๊ฐ๋ฅผ ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ๋ธ๋ก๊ทธ ์ธ๋ฑ์ค์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ฏ๋ก ์ด ๊ณผ์ ์ ๊ฑด๋๋ฐ๊ฒ ์ต๋๋ค.
ํํ์ ์ง์์ ํตํ ์ ์ฒด ํ ์คํธ ๊ฒ์
๋ค๋ฅธ ์ ํ์ ์์ฒญ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
# ะฝะฐะนะดะตะผ ะดะพะบัะผะตะฝัั, ะฒ ะบะพัะพััั
ะฒัััะตัะฐะตััั ัะปะพะฒะพ 'ะธััะพัะธะธ'
# query -> simple_query_string -> query ัะพะดะตัะถะธั ะฟะพะธัะบะพะฒัะน ะทะฐะฟัะพั
# ะฟะพะปะต title ะธะผะตะตั ะฟัะธะพัะธัะตั 3
# ะฟะพะปะต tags ะธะผะตะตั ะฟัะธะพัะธัะตั 2
# ะฟะพะปะต content ะธะผะตะตั ะฟัะธะพัะธัะตั 1
# ะฟัะธะพัะธัะตั ะธัะฟะพะปัะทัะตััั ะฟัะธ ัะฐะฝะถะธัะพะฒะฐะฝะธะธ ัะตะทัะปััะฐัะพะฒ
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
"query": {
"simple_query_string": {
"query": "ะธััะพัะธะธ",
"fields": [
"title^3",
"tags^2",
"content"
]
}
}
}'๋ฌ์์์ด ์ด๊ฐ ๋ถ์๊ธฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ด ์ฟผ๋ฆฌ๋ 'history'๋ผ๋ ๋จ์ด๋ง ํฌํจ๋์ด ์์ด๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ฐํํฉ๋๋ค.
์์ฒญ์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ ๋ฌธ์๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค.
""fried eggs" +(eggplant | potato) -frittata"์ฟผ๋ฆฌ ๊ตฌ๋ฌธ:
+ signifies AND operation
| signifies OR operation
- negates a single token
" wraps a number of tokens to signify a phrase for searching
* at the end of a term signifies a prefix query
( and ) signify precedence
~N after a word signifies edit distance (fuzziness)
~N after a phrase signifies slop amount# ะฝะฐะนะดะตะผ ะดะพะบัะผะตะฝัั ะฑะตะท ัะปะพะฒะฐ 'ัะตะฝะบะธ'
curl -XPOST "$ES_URL/blog2/post/_search?pretty" -d'
{
"query": {
"simple_query_string": {
"query": "-ัะตะฝะบะธ",
"fields": [
"title^3",
"tags^2",
"content"
]
}
}
}'
# ะฟะพะปััะธะผ 2 ะฟะพััะฐ ะฟัะพ ะบะพัะธะบะพะฒ์ฐธ์กฐ
PS
์ด๋ฌํ ๊ธฐ์ฌ ์์ ์ ๊ด์ฌ์ด ์๊ฑฐ๋, ์๋ก์ด ๊ธฐ์ฌ์ ๋ํ ์์ด๋์ด๊ฐ ์๊ฑฐ๋, ํ๋ ฅ ์ ์์ด ์์ผ์๋ฉด ๊ฐ์ธ ๋ฉ์์ง๋ m.kuzmin+habr@darkleaf.ru๋ก ๋ฉ์ผ์ ๋ณด๋ด์ฃผ์๋ฉด ๊ธฐ์ ๊ฒ์ ๋๋ค.
์ถ์ฒ : habr.com
