Elasticsearch Basics

Ko te Elasticsearch he miihini rapu me te json rest api, ma te whakamahi i a Lucene ka tuhia ki Java. He whakaahuatanga mo nga painga katoa o tenei miihini e waatea ana i paetukutuku mana. I nga mea e whai ake nei ka kiia e matou a Elasticsearch hei ES.

Ka whakamahia nga miihini rite mo nga rapunga uaua i roto i te paataka tuhinga. Hei tauira, rapu ma te whai whakaaro ki te ahua o te reo, ki te rapu ma te taunga geo.

I roto i tenei tuhinga ka korero ahau mo nga kaupapa o te ES ma te whakamahi i te tauira o te tuhi i nga pou rangitaki. Ka whakaatu ahau ki a koe me pehea te tātari, te whakariterite me te rapu tuhinga.

Kia kore ai e whakawhirinaki ki te punaha whakahaere, ka tono katoa ahau ki a ES ma te whakamahi i te CURL. He mono ano mo te google chrome e kiia ana tikanga.

He hononga ki te tuhinga me etahi atu puna. I te mutunga he hononga mo te uru tere ki nga tuhinga. Ka kitea nga whakamaramatanga o nga kupu tauhou i roto papakupu.

Tāuta ES

Ki te mahi i tenei, me tuatahi taatau Java. Kaihanga tūtohu whakauruhia nga putanga Java hou ake i te Java 8 whakahou 20 ranei Java 7 whakahou 55.

Kei te waatea te tohatoha ES i paetukutuku kaiwhakawhanake. I muri i te wetewete i te puranga me rere koe bin/elasticsearch. Kei te waatea ano nga kete mo te apt me te yum. Kei reira whakaahua mana mo te docker. Ētahi atu kōrero mō te tāutanga.

I muri i te whakaurunga me te whakarewatanga, me tirotirohia te mahi:

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

curl -X GET $ES_URL

Ka whiwhi tatou i tetahi mea penei:

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

Taupūtanga

Me taapiri he panui ki 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"
}'

whakautu tūmau:

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

ES hanga aunoa taupū rangitaki me Momo pou. Ka taea e tatou te tuhi i tetahi whakataurite herenga: ko te taurangi he papaa raraunga, ko te momo he ripanga kei roto i tenei paataka raraunga. Kei ia momo tona ake kaupapa − mahere, ano he ripanga hononga. Ka mahia aunoatia te Mahere ina taurangitia te tuhinga:

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

I roto i te whakautu a te tūmau, i taapirihia e ahau nga uara o nga mara o te tuhinga kua tohua i roto i nga korero:

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

Me mohio koe kaore a ES e wehewehe i te uara kotahi me te huinga uara. Hei tauira, he taitara noa kei roto i te mara taitara, kei roto i te mara tohu he huinga aho, ahakoa he rite tonu te ahua o te mapi.
Ka korero ano tatou mo te mapi a muri ake nei.

Nga tono

Te tiki tuhinga ma tona 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"
  }
}

I puta nga taviri hou i te whakautu: _version и _source. I te nuinga o te waa, ka timata nga taviri katoa _ ka whakarōpūtia hei mana.

_version whakaatu ana i te putanga tuhinga. E hiahiatia ana mo te mahi maukati pai. Hei tauira, e hiahia ana matou ki te whakarereke i tetahi tuhinga kei a ia te putanga 1. Ka tukuna e matou te tuhinga kua whakarerekehia me te tohu he whakatika tenei o te tuhinga me te putanga 1. Mena i whakatika ano tetahi atu tuhinga me te putanga 1 me te tuku huringa ki mua i a maatau, katahi ka Kaore a ES e whakaae ki a maatau huringa, na te mea kei te rongoa i te tuhinga me te putanga 2.

_source kei roto te tuhinga i taupūtia e matou. Kaore a ES e whakamahi i tenei uara mo nga mahi rapu na te mea Ka whakamahia nga tohu mo te rapu. Hei tiaki i te mokowā, ka penapenahia e ES he tuhinga puna kōpeke. Mena ka hiahia noa tatou ki te id, kaua ki te tuhinga puna katoa, ka taea e tatou te whakakore i te rokiroki puna.

Ki te kore matou e hiahia ki etahi atu korero, ka taea e matou anake nga korero o _source:

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

Ka taea hoki e koe te kowhiri i etahi mara anake:

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

Kia taupuhia etahi atu panui ka whakahaere i nga patai uaua ake.

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

Kōmakahia

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

I whiriwhiria e matou te pou whakamutunga. size whakawhāitihia te maha o ngā tuhinga ka tukuna. total e whakaatu ana i te tapeke o nga tuhinga e rite ana ki te tono. sort kei roto i te whakaputanga he huinga tauoti e mahia ai te tohatoha. Ko era. i hurihia te ra ki te tauoti. Ka kitea etahi atu korero mo te tohatoha i roto tuhinga.

Nga whiriwhiringa me nga patai

ES mai i te putanga 2 kaore e wehewehe i waenga i nga whiriwhiringa me nga patai ka whakauruhia te ariā o nga horopaki.
He rereke te horopaki patai mai i te horopaki tātari i te mea ka mahia e te patai he _score, kaore i te keteroki. Ka whakaatu ahau ki a koe he aha te _score a muri ake nei.

Tātarihia mā te rā

Ka whakamahia e matou te tono whānuitanga i roto i te horopaki o te tātari:

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

Tātarihia mā ngā tūtohu

Ka whakamahia e matou pātai wā ki te rapu i nga id tuhinga kei roto tetahi kupu:

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

Rapu kupu katoa

E toru o a maatau tuhinga kei roto enei e whai ake nei i te mara ihirangi:

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

Ka whakamahia e matou pātai ōrite ki te rapu i nga id tuhinga kei roto tetahi kupu:

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

Engari, ki te rapuhia e tatou nga "korero" i roto i te waahi ihirangi, kaore e kitea he mea, na te mea Ko nga kupu taketake anake kei roto i te taurangi, kaua o ratou kakau. Hei rapu i te kounga teitei, me whirihora e koe te kaitirotiro.

mara _score whakaaturanga hāngaitanga. Mena ka mahia te tono i roto i te horopaki tātari, ka rite tonu te uara _score ki te 1, ko te tikanga he taurite katoa ki te tātari.

Kaitātari

Kaitātari e hiahiatia ana hei huri i te kuputuhi puna ki te huinga tohu.
Ko nga Kaitātari he kotahi Kaiwhakamahara me te maha o nga whiringa TokenFilters. Ko te Tokenizer he maha pea i mua Tātaritari. Ka pakaruhia e nga Kaitohu te aho puna ki nga tohu, penei i nga waahi me nga tohu tohu. Ka taea e TokenFilter te huri i nga tohu, te muku, te taapiri ranei i nga mea hou, hei tauira, waiho noa te kakau o te kupu, tango i nga tohu, taapiri kupu taurite. CharFilter - ka huri i te aho puna katoa, hei tauira, ka tapahia nga tohu html.

He maha a ES kaitātari paerewa. Hei tauira, he kaitirotiro Russian.

Kia whai hua tatou api a kia kite tatou me pehea te huri a nga kaitirotiro paerewa me te ruhia i te aho "Nga korero rorirori mo nga punua":

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

Ka wehea e te kaitirotiro paerewa te aho ma nga mokowhiti ka huri i nga mea katoa ki te puiti iti, ka tangohia e te kaitirotiro ruhia nga kupu koretake, ka huri ki te puiti iti ka waiho te kakau o nga kupu.

Kia kite tatou ko tehea Tokenizer, TokenFilters, CharFilters e whakamahia ana e te kaitirotiro rusia:

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

Me whakamaarama i ta maatau kaitirotiro i runga i te reo Ruhia, ka tapahia nga tohu html. Me kii he taunoa, na te mea ka whakamahia taunoa he kaitirotiro me tenei ingoa.

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

Tuatahi, ka tangohia nga tohu HTML katoa mai i te aho puna, katahi ka wehewehea e te paerewa tokenizer ki nga tohu, ka neke nga tohu ka puta ki te iti, ka tangohia nga kupu iti, ka noho tonu nga tohu e toe ana hei kakau o te kupu.

Te hanga taupū

I runga ake i korerohia e matou te kaitirotiro taunoa. Ka pa ki nga mara aho katoa. He maha nga tohu kei roto i ta maatau panui, no reira ka tukuna ano e te kaitirotiro nga tohu. No te mea E rapu ana matou i nga panui ma te rite tonu ki tetahi tohu, katahi ka whakakorehia te tātaritanga mo te mara tohu.

Hangaia he blog2 taurangi me te kaitirotiro me te mapi, i monoa ai te tātaritanga o nga mara tohu:

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

Kia 3 ano nga panui ki tenei taurangi (blog2). Ka waiho e ahau tenei tukanga na te mea... he rite ki te taapiri tuhinga ki te taurangi rangitaki.

Rapu kupu katoa me te tautoko korero

Kia titiro tatou ki tetahi atu momo tono:

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

No te mea Kei te whakamahi matou i tetahi kaitirotiro me te reo Ruhia, katahi ka whakahokia e tenei tono nga tuhinga katoa, ahakoa ko te kupu 'hitori' anake kei roto.

Kei roto pea i te tono etahi tohu motuhake, hei tauira:

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

Tono wetereo:

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

tohutoro

PS

Mena kei te pirangi koe ki nga tuhinga-akoranga rite, he whakaaro mo nga tuhinga hou, he tono mo te mahi tahi ranei, ka koa ahau ki te whiwhi karere i roto i te karere whaiaro, i te imeera ranei [email tiakina].

Source: will.com