Elasticsearch යනු Lucene භාවිතා කර ජාවා භාෂාවෙන් ලියන ලද json rest api සහිත සෙවුම් යන්ත්රයකි. මෙම එන්ජිමේ සියලුම වාසි පිළිබඳ විස්තරයක් ලබා ගත හැකිය
ලේඛන දත්ත ගබඩාවක සංකීර්ණ සෙවීම් සඳහා සමාන එන්ජින් භාවිතා වේ. උදාහරණයක් ලෙස, භාෂාවේ රූප විද්යාව සැලකිල්ලට ගනිමින් සෙවීම හෝ භූ ඛණ්ඩාංක මගින් සෙවීම.
මෙම ලිපියෙන් මම බ්ලොග් සටහන් සුචිගත කිරීමේ උදාහරණය භාවිතා කරමින් ES හි මූලික කරුණු ගැන කතා කරමි. ලේඛන පෙරීම, වර්ග කිරීම සහ සෙවුම් කරන ආකාරය මම ඔබට පෙන්වන්නම්.
මෙහෙයුම් පද්ධතිය මත රඳා නොසිටීම සඳහා, මම CURL භාවිතයෙන් ES වෙත සියලු ඉල්ලීම් කරන්නෙමි. ගූගල් ක්රෝම් සඳහා ප්ලගිනයක් ද ඇත
පාඨයෙහි ලේඛන සහ වෙනත් මූලාශ්ර වෙත සබැඳි අඩංගු වේ. අවසානයේ ලේඛන වෙත ඉක්මන් ප්රවේශය සඳහා සබැඳි ඇත. නුහුරු පදවල අර්ථ දැක්වීම් සොයාගත හැකිය
ES ස්ථාපනය කිරීම
මෙය සිදු කිරීම සඳහා, අපට මුලින්ම ජාවා අවශ්ය වේ. සංවර්ධකයින්
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 ස්වයංක්රීයව සාදන ලදී
# Получим 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 තනි අගයක් සහ අගයන් මාලාවක් අතර වෙනස හඳුනා නොගන්නා බව සඳහන් කිරීම වටී. උදාහරණයක් ලෙස, මාතෘකා ක්ෂේත්රයේ හුදෙක් මාතෘකාවක් අඩංගු වන අතර, ටැග් ක්ෂේත්රයේ තන්තු මාලාවක් අඩංගු වේ, නමුත් ඒවා සිතියම්ගත කිරීමේදී එකම ආකාරයෙන් නිරූපණය කෙරේ.
සිතියම්කරණය ගැන අපි පසුව කතා කරමු.
ඉල්ලීම්
ලේඛනයක් එහි 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 සම්පීඩිත මූලාශ්ර ලේඛනයක් ගබඩා කරයි. අපට අවශ්ය වන්නේ හැඳුනුම්පත පමණක් නම්, සහ සම්පූර්ණ මූලාශ්ර ලේඛනය නොවේ නම්, අපට මූලාශ්ර ගබඩාව අක්රිය කළ හැක.
අපට අමතර තොරතුරු අවශ්ය නැතිනම්, අපට ලබාගත හැක්කේ _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 ජනනය කරන අතර එය හැඹිලිගත නොවේ. මම ඔබට පසුව පෙන්වන්නම් _ලකුණු මොනවාද කියලා.
දිනය අනුව පෙරහන් කරන්න
අපි ඉල්ලීම භාවිතා කරමු
# получим посты, опубликованные 1ого сентября или позже
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
"filter": {
"range": {
"published_at": { "gte": "2014-09-01" }
}
}
}'
ටැග් අනුව පෙරන්න
අපි පාවිච්චි කරන්නේ
# найдем все документы, в поле 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>
අපි පාවිච්චි කරන්නේ
# 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
} ]
}
}
කෙසේ වෙතත්, අපි අන්තර්ගත ක්ෂේත්රයේ “කතන්දර” සොයන්නේ නම්, අපට කිසිවක් සොයාගත නොහැක, මන්ද මෙම දර්ශකයේ මුල් වචන පමණක් අඩංගු වේ, ඒවායේ කඳන් නොවේ. උසස් තත්ත්වයේ සෙවීමක් සිදු කිරීම සඳහා, ඔබ විශ්ලේෂකය වින්යාසගත කළ යුතුය.
ක්ෂේත්රයේ _score
සංදර්ශන
විශ්ලේෂකයින්
විශ්ලේෂක එකකින් සමන්විත වේ
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
} ]
}
සම්මත විශ්ලේෂකය තන්තුව අවකාශ වලින් බෙදා සියල්ල කුඩා අකුරු බවට පරිවර්තනය කළේය, රුසියානු විශ්ලේෂකය වැදගත් නොවන වචන ඉවත් කර, එය කුඩා අකුරට පරිවර්තනය කර වචනවල කඳෙන් ඉවත් විය.
රුසියානු විශ්ලේෂකය භාවිතා කරන ටෝකනයිසර්, ටෝකන් ෆිල්ටර්ස්, චාර්ෆිල්ටර්ස් මොනවාදැයි බලමු:
{
"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 ටැග් ප්රභව තන්තුවෙන් ඉවත් කරනු ලැබේ, පසුව ටෝකනයිසර් ප්රමිතිය එය ටෝකන වලට බෙදනු ඇත, ප්රතිඵලයක් ලෙස ලැබෙන ටෝකන කුඩා අකුරු වෙත ගෙන යනු ඇත, නොවැදගත් වචන ඉවත් කරනු ලැබේ, සහ ඉතිරි ටෝකන වචනයේ කඳේ පවතිනු ඇත.
දර්ශකයක් නිර්මාණය කිරීම
ඉහත අපි විස්තර කළේ පෙරනිමි විශ්ලේෂකයයි. එය සියලුම තන්තු ක්ෂේත්ර සඳහා අදාළ වේ. අපගේ පළ කිරීමෙහි ටැග් මාලාවක් අඩංගු වේ, එබැවින් ටැග් විශ්ලේෂකය විසින් ද සකසනු ලැබේ. නිසා අපි ටැගයකට හරියටම ගැළපීමෙන් පළ කිරීම් සොයන්නෙමු, එවිට අපට ටැග් ක්ෂේත්රය සඳහා විශ්ලේෂණය අක්රිය කිරීමට අවශ්ය වේ.
ටැග් ක්ෂේත්රයේ විශ්ලේෂණය අක්රිය කර ඇති විශ්ලේෂකයක් සහ සිතියම්කරණයක් සහිත දර්ශක බ්ලොග්2 නිර්මාණය කරමු:
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"
]
}
}
}'
නිසා අපි රුසියානු ස්ටීමිං සමඟ විශ්ලේෂකයක් භාවිතා කරමින් සිටිමු, එවිට මෙම ඉල්ලීම 'ඉතිහාසය' යන වචනය පමණක් අඩංගු වුවද, සියලුම ලේඛන ආපසු ලබා දෙනු ඇත.
ඉල්ලීමෙහි විශේෂ අක්ෂර අඩංගු විය හැක, උදාහරණයක් ලෙස:
""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
ඔබ සමාන ලිපි-පාඩම් ගැන උනන්දුවක් දක්වන්නේ නම්, නව ලිපි සඳහා අදහස් තිබේ නම් හෝ සහයෝගීතාවය සඳහා යෝජනා තිබේ නම්, පුද්ගලික පණිවිඩයකින් හෝ විද්යුත් තැපෑලෙන් පණිවිඩයක් ලැබීමට මම සතුටු වෙමි. [විද්යුත් ආරක්ෂිත].
මූලාශ්රය: www.habr.com