Elasticsearch Basics

Investigatio elastica est quaesitio cum json reliquis api, usura Lucene et in Java scripta. Descriptio omnium commodorum huius machinae in promptu est rutrum. In sequentibus ad Elasticam inquisitionem referemus sicut ES.

Similia tormenta pro quaestionibus multiplicibus in documento datorum adhibentur. Exempli gratia, investigare ratione habita morphologiae linguae vel inquisitionis a coordinatis geo.

In hoc articulo loquar de basics of ES utendi exemplo diarii nuntiandi. Ostendam tibi quomodo documenta colum, modi et quaesita sint.

Ut ab operativa ratio non pendeat, omnes petitiones faciam ut ES CURL. Est etiam plugin pro google chrome quod vocatur sensum.

Textus nexus cum documentis aliisque fontibus continet. In fine sunt nexus prompti ad documentorum accessus. Definitiones vocabulorum incognitarum inveniri possunt in glossaria.

installing ES

Ad hoc primum opus Java. Developers suadeo versiones Javae recentiores installant quam Java 8 renovatio 20 vel Java 7 renovatio 55.

Distributio ES est available at elit website. Post vestimenta archivo debes currere bin/elasticsearch. Etiam available packages enim apta et yum. sunt officialis imago pro docker. More circa institutionem.

Post institutionem ac launch, officiationem reprehendo:

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

curl -X GET $ES_URL

aliquid simile hoc accipiemus;

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

Indexing

Addamus cursorem ad 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"
}'

responsum servo:

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

ES automatice creatus index blog and genus Apost. Analogiam conditionalem haurire possumus: index database est, et typus mensa est in hoc database. Quisque genus suum consilium habet tabularum faciendarumnon secus ac mensam relativam. Mapping generatur automatice cum scriptum est indexed:

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

In servo responsionis valores agrorum in commentariorum indicem addidi:

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

Notatu dignum est ES non distinguere inter unum valorem et aciem valorum. Verbi gratia, titulus campus simpliciter titulum continet, et campus tags chordarum aciem continet, quamvis eodem modo in tabulatione repraesentantur.
Plura de tabulando postea loquemur.

petitiones

Documentum per id retrieving:

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

Novae claves in responsione apparuerunt: _version и _source. In genere omnes claves ab initio _ collocantur officialis.

clavem _version documentum ostendit versio. Eu densis mechanism opus est ad operandum. Exempli gratia, documentum mutare volumus, quod versionem habet 1. Documentum mutatum exhibemus et indicamus hanc esse emendationem documenti cum versione 1. Si alius etiam documentum cum versione 1 edidit et mutationes coram nobis submisit, tum ES mutationes nostras non accipiet, quia documentum reponit cum versione II.

clavem _source continet documentum, quod nos recensuimus. ES hoc valore non utitur ad res quaerendas quia Indices ad inquisitionem adhibentur. Ut spatium servaret, ES documentum fons compressum reponit. Si id tantum indigemus, nec documentum integrum, tunc repositione inactivare possumus.

Si informationis informationis non indigemus, solummodo contenta _fontis accipere possumus:

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

Certos agros solum eligere potes;

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

Indicamus pauca plura nuntia et interrogationes magis implicatas percurramus.

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

genus

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

Nos postremo post- elegimus. size quot litterae limites ferantur. total numerus documentorum ostendit petitionem matching. sort in output continet ordinem integri per quem genus conficitur. Illae. in integrum diem conversum. More information about sorting potest inveniri in documentum.

Filtra et queries

ES cum versio 2 inter columellas et interrogationes non distinguit, pro notio contextuum introducitur.
Quaesitio contextus a filtro differt in eo quod quaesitum _score gignit et conditivo non est. Ostendam tibi quid score postea est.

Colamentum ad tempus

Utimur petitionem range in contextu colum:

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

Filtrum per tags

Utimur terminus query ut quaeramus documentum notis quibus verbum datum est:

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

Full text search

Tria documenta nostra quae sequuntur in campo contento continent;

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

Utimur par query ut quaeramus documentum notis quibus verbum datum est:

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

Attamen si quaerimus "fabulas" in campo contenti, nihil inveniemus, quia Index verborum originalium tantum, non caulium continet. Ut investigationem qualitatem capias, analystorem configurare debes.

agri _score ostendit momentum. Si petitio fit in contextu filtrum, valorem score semper aequabitur 1 , quod completum colum significat.

Analysers

Analysers necesse est ut fontem textum in certa signa convertat.
Analyzers ex uno Tokenizer et multa ad libitum TokenFilters. Tokenizer praecedere potest a pluribus CharFilters. Signi chordae fontem in signis frangunt, sicut ingenia spatia et interpunctionem. TokenFilter signa mutare potest, novas delere vel addere, verbi gratia, solum radicem verbi relinquere, praepositiones removere, synonyma addere. CharFilter - totum principium chordae mutat, exempli gratia, tags html excidit.

ES habet plures vexillum analysers. Exempli gratia, analyser Russian.

Lets utilitatem API et videamus quomodo vexillum et analysres Russici chordam "Funny fabulas de kittens" transforment:

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

Vexillum analystor filum in spatia scindit et omnia ad casum inferiorem convertit, analysor russicus verba levia removit, eam ad casum deprimit et radicem verborum reliquit.

Videamus quae Tokenizer, TokenFilters, CharFilters analysres Russici adhibet:

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

Describamus analysrem nostrum secundum Russian, quod excidit ex html tags. Vocemus defaltam, quia analyser hoc nomine defalta adhibebitur.

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

Primum, omnia HTML tags a filo fonte tollentur, tum vexillum signum illud in signa dividet, signa consequentia ad casum inferiorem movebunt, verba parva tollentur, et reliqua signa verbi truncum remanebunt.

Creando Index

Supra diximus default analyser descriptus est. Omnibus chordis campis applicabit. Noster postes ordinatam tags continet, ergo tags etiam ab analysi procedendum erit. Quod Quaerimus nuntia exacta match ad tag, tunc opus est ut disable analysis pro textibus agrorum.

Indicem blog2 faciamus cum analysi et tabulatione, in qua analysis tags campi debilis est:

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

Easdem 3 epistolas huic indice addamus (blog2). Hoc processum omittam, quia... Simile est documenta addere ad indicem diarii.

Full text search with expression support

Inspice aliam rationem petitionis Lets:

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

Quod Utimur analysi cum vocali Russica, tum haec petitio omnia documenta reddet, cum solum verbum "historiae" contineant.

Postulatio speciales characteres continentes, exempli gratia:

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

Petitio syntaxis:

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

References

PS

Si interesse in similibus articulis lectionibus, notiones habent pro articulis novis, vel proposita cooperationis, tum gaudebo nuntium recipere in nuntio personali vel electronico. [Inscriptio protected].

Source: www.habr.com