Bun-bheachdan Elasticsearch

Is e einnsean sgrùdaidh a th’ ann an Elasticsearch le json rest api, a’ cleachdadh Lucene agus sgrìobhte ann an Java. Tha tuairisgeul air na buannachdan uile a tha aig an einnsean seo ri fhaighinn aig làrach-lìn oifigeil. Anns na leanas bheir sinn iomradh air Elasticsearch mar ES.

Bithear a’ cleachdadh einnseanan coltach ris airson rannsachaidhean iom-fhillte ann an stòr-dàta sgrìobhainnean. Mar eisimpleir, sgrùdadh a’ toirt aire do mhorf-eòlas a’ chànain no sgrùdadh le geo-chomharran.

San artaigil seo bruidhnidh mi mu bhunaitean ES a’ cleachdadh an eisimpleir de bhith a’ clàradh puist bhlogaichean. Seallaidh mi dhut mar as urrainn dhut sgrìobhainnean a shìoladh, a sheòrsachadh agus a sgrùdadh.

Gus nach bi mi an urra ris an t-siostam obrachaidh, nì mi a h-uile iarrtas gu ES a’ cleachdadh CURL. Tha plugan ann cuideachd airson google chrome ris an canar mothachadh.

Anns an teacsa tha ceanglaichean gu sgrìobhainnean agus tobraichean eile. Aig an deireadh tha ceanglaichean ann airson faighinn gu sgiobalta chun na sgrìobhainnean. Gheibhear mìneachaidhean de bhriathran air nach eil iad eòlach ann an beag-fhaclair.

Stàladh

Gus seo a dhèanamh, feumaidh sinn Java an toiseach. Luchd-leasachaidh moladh stàlaich dreachan Java nas ùire na Java 8 update 20 no Java 7 update 55.

Tha an sgaoileadh ES ri fhaighinn aig làrach leasaiche. Às deidh dhut an tasglann a dhì-phapadh feumaidh tu ruith bin/elasticsearch. Ri fhaighinn cuideachd pacaidean airson apt agus yum. Tha Dealbh oifigeil airson docker. Tuilleadh mu dheidhinn an stàladh.

Às deidh an stàladh agus an cur air bhog, leig dhuinn sùil a thoirt air gnìomhachd:

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

curl -X GET $ES_URL

Gheibh sinn rudeigin mar seo:

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

Nach cuir sinn post gu 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"
}'

freagairt an fhrithealaiche:

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

ES air a chruthachadh gu fèin-ghluasadach clàr-amais blog agus seòrsa de post. Is urrainn dhuinn samhlachas cumhach a tharraing: is e stòr-dàta a th’ ann an clàr-amais, agus tha seòrsa na chlàr san stòr-dàta seo. Tha a sgeama fhèin aig gach seòrsa - mapadh, dìreach mar bhòrd dàimh. Thèid mapadh a chruthachadh gu fèin-ghluasadach nuair a tha an sgrìobhainn clàraichte:

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

Ann am freagairt an fhrithealaiche, chuir mi luachan raointean na sgrìobhainn clàraichte anns na beachdan:

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

'S fhiach toirt fa-near nach eil ES a' dèanamh eadar-dhealachadh eadar aon luach agus sreath de luachan. Mar eisimpleir, chan eil anns an raon tiotal ach tiotal, agus tha sreath de shreathan anns an raon tagaichean, ged a tha iad air an riochdachadh san aon dòigh ann am mapadh.
Bruidhnidh sinn barrachd mu dheidhinn mapadh nas fhaide air adhart.

Iarrtasan

A’ faighinn sgrìobhainn air ais leis an id aice:

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

Nochd iuchraichean ùra san fhreagairt: _version и _source. Anns an fharsaingeachd, a h-uile iuchraichean a 'tòiseachadh le _ air an seòrsachadh mar oifigeil.

Prìomh _version a’ sealltainn dreach na sgrìobhainn. Tha feum air airson an uidheamachd glasaidh dòchasach a bhith ag obair. Mar eisimpleir, tha sinn airson sgrìobhainn aig a bheil dreach 1 atharrachadh. Bidh sinn a’ cur a-steach an sgrìobhainn atharraichte agus a’ nochdadh gur e deasachadh de sgrìobhainn a tha seo le dreach 1. Ma dheasaich cuideigin eile sgrìobhainn le dreach 1 cuideachd agus ma chuir sinn a-steach atharrachaidhean air thoiseach oirnn, an uairsin Cha ghabh ES ris na h-atharraichean againn, oir bidh e a’ stòradh na sgrìobhainn le dreach 2.

Prìomh _source anns a bheil an sgrìobhainn a chlàraich sinn. Cha bhith ES a’ cleachdadh an luach seo airson obair sgrùdaidh air sgàth Tha clàran-amais gan cleachdadh airson rannsachadh. Gus àite a shàbhaladh, bidh ES a’ stòradh sgrìobhainn stòr teann. Mura feum sinn ach an id, agus chan e an sgrìobhainn stòr gu lèir, is urrainn dhuinn stòradh stòr a chuir dheth.

Mura h-eil feum againn air fiosrachadh a bharrachd, chan fhaigh sinn ach na th’ ann an _source:

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

Faodaidh tu cuideachd dìreach raointean sònraichte a thaghadh:

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

Dèanamaid clàr-amais beagan a bharrachd phuist agus ruith ceistean nas iom-fhillte.

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

Deasachadh

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

Thagh sinn am post mu dheireadh. size cuingealachadh air an àireamh de sgrìobhainnean a thèid a thoirt seachad. total sealltainn an àireamh iomlan de sgrìobhainnean a fhreagras ris an iarrtas. sort anns an toradh tha sreath de shlànaichean leis an tèid an seòrsachadh a dhèanamh. An fheadhainn sin. chaidh an ceann-latha atharrachadh gu integer. Gheibhear tuilleadh fiosrachaidh mu sheòrsachadh ann an sgrìobhainnean.

Filters agus ceistean

ES leis nach eil dreach 2 a’ dèanamh eadar-dhealachadh eadar sìoltachain agus ceistean, an àite sin tha bun-bheachd cho-theacsan air a thoirt a-steach.
Tha co-theacs ceiste eadar-dhealaichte bho cho-theacs sìoltachain leis gu bheil an ceist a’ gineadh _score agus nach eil e air a thasgadh. Seallaidh mi dhut dè a th’ ann an _score nas fhaide air adhart.

Criathraich a rèir ceann-latha

Cleachdaidh sinn an t-iarrtas raon ann an co-theacs an criathrag:

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

Criathraich le tagaichean

Cleachd ceist teirm a lorg ids sgrìobhainnean anns a bheil facal sònraichte:

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

Rannsachadh teacsa slàn

Tha na leanas anns an raon susbaint ann an trì de na sgrìobhainnean againn:

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

Cleachd ceist maids a lorg ids sgrìobhainnean anns a bheil facal sònraichte:

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

Ach, ma nì sinn sgrùdadh airson “sgeulachdan” anns an raon susbaint, chan fhaigh sinn dad, oir Chan eil anns a’ chlàr-amais ach na faclan tùsail, chan e na gasan aca. Gus sgrùdadh àrd-inbhe a dhèanamh, feumaidh tu an anailisiche a rèiteachadh.

achadh _score taisbeanaidhean buntainneachd. Ma thèid an t-iarrtas a chuir gu bàs ann an co-theacs sìoltachain, bidh an luach _score an-còmhnaidh co-ionann ri 1, a tha a’ ciallachadh maids iomlan ris a’ chriathrag.

Luchd-anailis

Luchd-anailis tha feum air gus an teacsa tùsail a thionndadh gu seata chomharran.
Tha anail air a dhèanamh suas de aon Tòcadair agus grunn roghainneil TokenFilters. Faodaidh grunn a bhith air thoiseach air Tokenizer Filters Char. Bidh Tokenizers a’ briseadh an t-sreang stòr gu comharran, leithid beàrnan agus caractaran puingeachaidh. Faodaidh TokenFilter comharran atharrachadh, cuir às no cuir ris feadhainn ùra, mar eisimpleir, fàg dìreach bonn an fhacail, thoir air falbh roimhearan, cuir co-fhaclan ris. CharFilter - ag atharrachadh an t-sreang stòr gu lèir, mar eisimpleir, a’ gearradh a-mach tagaichean html.

Tha grunnan aig ES sgrùdairean àbhaisteach. Mar eisimpleir, anailisiche Russian.

Gabhamaid brath api agus chì sinn mar a bhios an luchd-anailis àbhaisteach agus Ruiseanach ag atharrachadh an t-sreang “Sgeulachdan èibhinn mu phiseagan”:

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

Roinn an anailisiche àbhaisteach an sreang le beàrnan agus thionndaidh e a h-uile càil gu cùis ìosal, thug an anailisiche Ruiseanach air falbh faclan neo-chudromach, thionndaidh e gu litrichean beaga agus dh’ fhàg e cas nam faclan.

Chì sinn dè an Tokenizer, TokenFilters, CharFilters a bhios an anailisiche Ruiseanach a’ cleachdadh:

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

Bheir sinn cunntas air an anailisiche againn stèidhichte air Ruiseanach, a ghearras a-mach tagaichean html. Canaidh sinn e default, oir thèid anailisiche leis an ainm seo a chleachdadh gu bunaiteach.

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

An toiseach, thèid a h-uile tag HTML a thoirt air falbh bhon t-sreang stòr, an uairsin bidh an inbhe tokenizer ga roinn ann an comharran, gluaisidh na comharran a thig às gu litrichean beaga, thèid faclan gun bhrìgh a thoirt air falbh, agus fuirichidh na comharran a tha air fhàgail mar bhunait an fhacail.

A 'cruthachadh clàr-amais

Gu h-àrd thug sinn cunntas air an anailisiche bunaiteach. Bidh e a 'buntainn ris a h-uile raon sreang. Anns a’ phost againn tha sreath de thagaichean, agus mar sin bidh na tagaichean air an giullachd leis an anailisiche cuideachd. Air sgàth Tha sinn a’ coimhead airson puist a rèir maids cheart ri tag, an uairsin feumaidh sinn mion-sgrùdadh a chuir dheth airson raon nan tagaichean.

Cruthaichidh sinn blog clàr-amais2 le anailisiche agus mapadh, anns a bheil mion-sgrùdadh air raon nan tagaichean ciorramach:

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

Nach cuir sinn na h-aon phuist 3 ris a’ chlàr-amais seo (blog2). Fàgaidh mi am pròiseas seo air sgàth... tha e coltach ri bhith a’ cur sgrìobhainnean ri clàr-amais a’ bhlog.

Rannsachadh teacsa slàn le taic faireachdainn

Bheir sinn sùil air seòrsa eile de dh’ iarrtas:

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

Air sgàth Tha sinn a 'cleachdadh anailisiche le casg Ruiseanach, an uairsin tillidh an t-iarrtas seo a h-uile sgrìobhainn, ged nach eil annta ach am facal' eachdraidh '.

Faodaidh caractaran sònraichte a bhith san iarrtas, mar eisimpleir:

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

Iarr co-chàradh:

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

iomraidhean

PS

Ma tha ùidh agad ann an artaigilean-leasanan coltach ris, ma tha beachdan agad airson artaigilean ùra, no ma tha molaidhean agad airson co-obrachadh, bidh mi toilichte teachdaireachd fhaighinn ann am brath pearsanta no air post-d [post-d fo dhìon].

Source: www.habr.com