Awọn ipilẹ Elasticsearch

Elasticsearch jẹ ẹrọ wiwa pẹlu json isinmi api, lilo Lucene ati kikọ ni Java. Apejuwe ti gbogbo awọn anfani ti yi engine wa ni aaye ayelujara osise. Ninu ohun ti o tẹle a yoo tọka si Elasticsearch bi ES.

Awọn ẹrọ ti o jọra ni a lo fun awọn wiwa idiju ninu ibi ipamọ data iwe kan. Fún àpẹrẹ, ìṣàwárí ní ìṣirònú ẹ̀dá-ẹ̀dá-ẹ̀dá èdè tàbí ìṣàwárí nípasẹ̀ àwọn ìṣàkóso geo.

Ninu àpilẹkọ yii Emi yoo sọrọ nipa awọn ipilẹ ti ES nipa lilo apẹẹrẹ ti titọka awọn ifiweranṣẹ bulọọgi. Emi yoo fihan ọ bi o ṣe le ṣe àlẹmọ, tootọ ati ṣawari awọn iwe aṣẹ.

Ni ibere ki o má ba dale lori ẹrọ ṣiṣe, Emi yoo ṣe gbogbo awọn ibeere si ES nipa lilo CURL. Ohun itanna tun wa fun google chrome ti a pe ori.

Ọrọ naa ni awọn ọna asopọ si iwe ati awọn orisun miiran. Ni ipari awọn ọna asopọ wa fun wiwọle yara yara si iwe. Awọn itumọ ti awọn ofin ti ko mọ ni a le rii ni awọn iwe -itumọ.

Fifi ES

Lati ṣe eyi, a nilo Java akọkọ. Awọn olupilẹṣẹ ṣeduro fi sori ẹrọ awọn ẹya Java tuntun ju Java 8 imudojuiwọn 20 tabi Java 7 imudojuiwọn 55.

Pipin ES wa ni Olùgbéejáde aaye ayelujara. Lẹhin ṣiṣi silẹ pamosi o nilo lati ṣiṣẹ bin/elasticsearch. Tun wa awọn idii fun apt ati yum... o wa osise aworan fun docker. Diẹ ẹ sii nipa fifi sori.

Lẹhin fifi sori ẹrọ ati ifilọlẹ, jẹ ki a ṣayẹwo iṣẹ ṣiṣe:

# для удобства запомним адрес в переменную
#export ES_URL=$(docker-machine ip dev):9200
export ES_URL=localhost:9200

curl -X GET $ES_URL

A yoo gba nkan bi eleyi:

{
  "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"
}

Titọka

Jẹ ki a ṣafikun ifiweranṣẹ si 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"
}'

esi olupin:

{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "created" : false
}

ES laifọwọyi ṣẹda atọka bulọọgi ati iru kan ifiweranṣẹ. A le fa apere ni àídájú: atọka jẹ database, ati iru kan jẹ tabili kan ninu aaye data yii. Kọọkan iru ni o ni awọn oniwe-ara eni - aworan atọka, gẹgẹ bi tabili ibatan. Aworan aworan jẹ ipilẹṣẹ laifọwọyi nigbati iwe-ipamọ naa ba jẹ atọka:

# Получим mapping всех типов индекса blog
curl -XGET "$ES_URL/blog/_mapping?pretty"

Ninu esi olupin, Mo ṣafikun awọn iye ti awọn aaye ti iwe atọka ninu awọn asọye:

{
  "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"
          }
        }
      }
    }
  }
}

O tọ lati ṣe akiyesi pe ES ko ṣe iyatọ laarin iye kan ati ọpọlọpọ awọn iye. Fun apẹẹrẹ, aaye akọle ni nìkan ni akọle kan, ati aaye awọn afi ni ọpọlọpọ awọn gbolohun ọrọ, botilẹjẹpe wọn jẹ aṣoju ni ọna kanna ni aworan agbaye.
A yoo soro siwaju sii nipa aworan agbaye nigbamii.

Awọn ibeere

Gbigba iwe pada nipasẹ id rẹ:

# извлечем документ с 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"
  }
}

Awọn bọtini titun han ninu esi: _version и _source. Ni gbogbogbo, gbogbo awọn bọtini ti o bere pẹlu _ ti wa ni classified bi osise.

Bọtini _version fihan ẹya iwe. O nilo fun ẹrọ titiipa ireti lati ṣiṣẹ. Fun apẹẹrẹ, a fẹ lati yi iwe-ipamọ ti o ni ikede 1 pada. A fi iwe-ipamọ ti o yipada silẹ ati fihan pe eyi jẹ atunṣe ti iwe-ipamọ pẹlu ẹya 1. Ti ẹlomiiran ba tun ṣe atunṣe iwe kan pẹlu ẹya 1 ti o si fi awọn ayipada silẹ niwaju wa, lẹhinna ES kii yoo gba awọn ayipada wa, nitori o tọju iwe naa pẹlu ẹya 2.

Bọtini _source ni iwe ti a ṣe atọka. ES ko lo iye yii fun awọn iṣẹ ṣiṣe wiwa nitori Awọn atọka ti wa ni lilo fun wiwa. Lati fi aaye pamọ, ES tọju iwe orisun fisinuirindigbindigbin. Ti a ba nilo id nikan, kii ṣe gbogbo iwe orisun, lẹhinna a le mu ibi ipamọ orisun kuro.

Ti a ko ba nilo alaye ni afikun, a le gba awọn akoonu ti _source nikan:

curl -XGET "$ES_URL/blog/post/1/_source?pretty"
{
  "title" : "Веселые котята",
  "content" : "<p>Смешная история про котят<p>",
  "tags" : [ "котята", "смешная история" ],
  "published_at" : "2014-09-12T20:44:42+00:00"
}

O tun le yan awọn aaye kan nikan:

# извлечем только поле title
curl -XGET "$ES_URL/blog/post/1?_source=title&pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "Веселые котята"
  }
}

Jẹ ki a ṣe atọka awọn ifiweranṣẹ diẹ sii ati ṣiṣe awọn ibeere ti o ni eka sii.

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"
}'

Lẹsẹẹsẹ

# найдем последний пост по дате публикации и извлечем поля 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 ]
    } ]
  }
}

A yan awọn ti o kẹhin post. size ifilelẹ awọn nọmba ti awọn iwe aṣẹ lati wa ni ti oniṣowo. total fihan nọmba lapapọ ti awọn iwe aṣẹ ti o baamu ibeere naa. sort ninu iṣẹjade ni ọpọlọpọ awọn odidi nipasẹ eyiti a ṣe tito lẹsẹsẹ. Awon. awọn ọjọ ti a iyipada si ohun odidi. Alaye diẹ sii nipa tito lẹsẹsẹ ni a le rii ni iwe.

Ajọ ati awọn ibeere

ES niwon ikede 2 ko ṣe iyatọ laarin awọn asẹ ati awọn ibeere, dipo awọn Erongba ti àrà ti wa ni a ṣe.
Iyipada ibeere kan yatọ si ipo àlẹmọ ni pe ibeere naa ṣe ipilẹṣẹ _score ati pe ko ṣe cache. Emi yoo fihan ọ kini _score jẹ nigbamii.

Àlẹmọ nipa ọjọ

A lo ibeere naa ibiti o ni ayika ti àlẹmọ:

# получим посты, опубликованные 1ого сентября или позже
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "filter": {
    "range": {
      "published_at": { "gte": "2014-09-01" }
    }
  }
}'

Àlẹmọ nipa afi

A nlo ìbéèrè igba lati wa ids iwe ti o ni ọrọ ti a fifun ninu:

# найдем все документы, в поле 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" : [ "котята" ]
      }
    } ]
  }
}

Wiwa ọrọ ni kikun

Mẹta ti awọn iwe aṣẹ wa ni nkan wọnyi ninu aaye akoonu:

  • <p>Смешная история про котят<p>
  • <p>Смешная история про щенков<p>
  • <p>Душераздирающая история про бедного котенка с улицы<p>

A nlo ibeere baramu lati wa ids iwe ti o ni ọrọ ti a fifun ninu:

# 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
    } ]
  }
}

Sibẹsibẹ, ti a ba wa "awọn itan" ni aaye akoonu, a kii yoo ri ohunkohun, nitori Atọka naa ni awọn ọrọ atilẹba nikan, kii ṣe awọn eso wọn. Lati le ṣe wiwa didara ga, o nilo lati tunto olutupalẹ naa.

Aaye _score fihan ibaramu. Ti o ba ti ṣe ibeere naa ni ipo àlẹmọ, lẹhinna iye _score yoo ma jẹ deede si 1 nigbagbogbo, eyiti o tumọ si ibaramu pipe si àlẹmọ.

Awọn onitumọ

Awọn onitumọ nilo lati yi ọrọ orisun pada si akojọpọ awọn ami.
Awọn atunnkanka ni ọkan Tokenizer ati ọpọlọpọ awọn iyan TokenFilters. Tokenizer le jẹ iṣaaju nipasẹ ọpọlọpọ CharFilters. Tokenizers fọ okun orisun sinu awọn ami ami, gẹgẹbi awọn alafo ati awọn ami ifamisi. TokenFilter le yi awọn ami-ami pada, paarẹ tabi ṣafikun awọn tuntun, fun apẹẹrẹ, fi eso ti ọrọ naa silẹ nikan, yọ awọn asọtẹlẹ kuro, ṣafikun awọn aami-itumọ. CharFilter - yi gbogbo okun orisun pada, fun apẹẹrẹ, ge awọn afi HTML kuro.

ES ni ọpọlọpọ boṣewa analyzers. Fun apẹẹrẹ, ohun analyzer russian.

Jẹ ki a lo anfani api ati pe jẹ ki a wo bii boṣewa ati awọn atunnkanka russian ṣe yi okun naa pada “Awọn itan aladun nipa awọn ọmọ ologbo”:

# используем анализатор 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
  } ]
}

Oluyanju boṣewa pin okun naa nipasẹ awọn alafo ati yi ohun gbogbo pada si ọran kekere, olutọpa Russia yọ awọn ọrọ ti ko ṣe pataki, yi pada si ọran kekere ati fi idi ti awọn ọrọ naa silẹ.

Jẹ ki a wo Tokenizer, TokenFilters, CharFilters olutupalẹ Russia nlo:

{
  "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 отсутствуют */
    }
  }
}

Jẹ ki a ṣe apejuwe olutupalẹ wa ti o da lori Ilu Rọsia, eyiti yoo ge awọn ami html kuro. Jẹ ki a pe ni aiyipada, nitori Oluyanju pẹlu orukọ yii yoo ṣee lo nipasẹ aiyipada.

{
  "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"
      ]
    }
  }
}

Ni akọkọ, gbogbo awọn aami HTML yoo yọkuro lati okun orisun, lẹhinna boṣewa tokenizer yoo pin si awọn ami-ami, awọn ami abajade yoo gbe lọ si kekere, awọn ọrọ ti ko ṣe pataki yoo yọkuro, ati awọn ami to ku yoo wa ni isunmọ ti ọrọ naa.

Ṣiṣẹda Atọka

Loke a ṣe apejuwe olutupalẹ aiyipada. Yoo kan si gbogbo awọn aaye okun. Ifiweranṣẹ wa ni ọpọlọpọ awọn afi, nitorinaa awọn afi yoo tun ṣe ilana nipasẹ olutupalẹ. Nitori A n wa awọn ifiweranṣẹ nipasẹ ibaamu deede si tag, lẹhinna a nilo lati mu itupalẹ fun aaye awọn afi.

Jẹ ki a ṣẹda bulọọgi2 atọka pẹlu olutupalẹ ati aworan agbaye, ninu eyiti itupalẹ aaye awọn afi jẹ alaabo:

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"
        }
      }
    }
  }
}'

Jẹ ki a ṣafikun awọn ifiweranṣẹ 3 kanna si atọka yii (blog2). Emi yoo fi ilana yii silẹ nitori ... o jẹ iru si fifi awọn iwe aṣẹ kun si atọka bulọọgi.

Wiwa ọrọ ni kikun pẹlu atilẹyin ikosile

Jẹ ki a wo iru ibeere miiran:

# найдем документы, в которых встречается слово 'истории'
# 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"
      ]
    }
  }
}'

Nitori A nlo olutupalẹ pẹlu isunmọ Russian, lẹhinna ibeere yii yoo da gbogbo awọn iwe aṣẹ pada, botilẹjẹpe wọn nikan ni ọrọ 'itan' ni ninu.

Ìbéèrè náà le ní àwọn ọ̀rọ̀ àkànṣe nínú, fún àpẹrẹ:

""fried eggs" +(eggplant | potato) -frittata"

Beere sintasi:

+ 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 поста про котиков

jo

PS

Ti o ba nifẹ si awọn nkan-ẹkọ ti o jọra, ni awọn imọran fun awọn nkan tuntun, tabi ni awọn igbero fun ifowosowopo, lẹhinna Emi yoo dun lati gba ifiranṣẹ kan ni ifiranṣẹ ti ara ẹni tabi nipasẹ imeeli [imeeli ni idaabobo].

orisun: www.habr.com