Mga Pangunahing Kaalaman sa Elasticsearch

Ang Elasticsearch ay isang search engine na may JSON REST API, gamit ang Lucene at nakasulat sa Java. Ang isang paglalarawan ng lahat ng mga benepisyo ng engine na ito ay makukuha sa opisyal na websiteMula ngayon, tatawagin natin ang Elasticsearch bilang ES.

Ang mga naturang engine ay ginagamit para sa mga kumplikadong paghahanap sa database ng dokumento, tulad ng paghahanap batay sa morpolohiya ng wika o paghahanap sa pamamagitan ng mga geographic na coordinate.

Sa artikulong ito, tatalakayin ko ang mga pangunahing kaalaman sa ES gamit ang halimbawa ng pag-index ng mga post sa blog. Ipapakita ko sa iyo kung paano mag-filter, mag-sort, at maghanap ng mga dokumento.

Upang maging malaya sa operating system, gagawin ko ang lahat ng aking kahilingan sa ES gamit ang CURL. Mayroon ding isang plugin para sa Google Chrome na tinatawag kahulugan.

Ang mga link sa dokumentasyon at iba pang mga mapagkukunan ay ibinibigay sa buong teksto. Ang mga link sa mabilis na pag-access sa dokumentasyon ay ibinibigay sa dulo. Ang mga kahulugan ng hindi pamilyar na mga termino ay matatagpuan sa mga glosaryo.

Pag-install ng ES

Para dito kailangan muna namin ng Java. Mga developer magrekomenda Mag-install ng mga bersyon ng Java na mas bago kaysa sa Java 8 update 20 o Java 7 update 55.

Ang pamamahagi ng ES ay magagamit sa website ng developerPagkatapos i-unpack ang archive, kailangan mong tumakbo bin/elasticsearch. Available din mga pakete para sa apt at yum. Mayroong opisyal na imahe para sa Docker. Higit pa tungkol sa pag-install.

Pagkatapos ng pag-install at paglunsad, suriin natin ang pag-andar:

# для удобства Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ адрСс Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
#export ES_URL=$(docker-machine ip dev):9200
export ES_URL=localhost:9200

curl -X GET $ES_URL

Makakatanggap kami ng tugon na mukhang ganito:

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

Pag-index

Magdagdag tayo ng post sa 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"
}'

tugon ng server:

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

Awtomatikong nilikha ang ES index blog at uri ng post. Ang isang magaspang na pagkakatulad ay maaaring iguhit: ang isang index ay isang database, at ang isang uri ay isang talahanayan sa loob ng database na iyon. Ang bawat uri ay may sariling schemaβ€” paggawa ng mga mapa, parang relational table lang. Awtomatikong nabuo ang pagmamapa kapag na-index ang isang dokumento:

# ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ mapping всСх Ρ‚ΠΈΠΏΠΎΠ² индСкса blog
curl -XGET "$ES_URL/blog/_mapping?pretty"

Sa tugon ng server, idinagdag ko ang mga halaga ng field ng na-index na dokumento sa mga komento:

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

Ito ay nagkakahalaga na tandaan na ang ES ay hindi nakikilala sa pagitan ng isang solong halaga at isang hanay ng mga halaga. Halimbawa, ang field ng pamagat ay naglalaman lamang ng isang pamagat, habang ang field ng mga tag ay naglalaman ng isang hanay ng mga string, kahit na pareho silang kinakatawan sa pagmamapa.
Pag-uusapan natin ang tungkol sa pagmamapa nang mas detalyado sa ibang pagkakataon.

kahilingan

Pag-extract ng dokumento gamit ang ID nito:

# ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с 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"
  }
}

Ang mga bagong key ay lumitaw sa tugon: _version ΠΈ _sourceSa pangkalahatan, lahat ng mga susi na nagsisimula sa _ ay inuri bilang mga item ng serbisyo.

Key _version Ipinapakita ang bersyon ng dokumento. Ito ay kinakailangan para gumana ang optimistic locking mechanism. Halimbawa, gusto naming palitan ang isang dokumento na may bersyon 1. Isusumite namin ang binagong dokumento at isinasaad na isa itong rebisyon sa dokumentong may bersyon 1. Kung may ibang nag-edit din ng dokumentong may bersyon 1 at nagsumite ng mga pagbabago bago sa amin, hindi tatanggapin ng ES ang aming mga pagbabago, dahil iniimbak nito ang dokumento na may bersyon 2.

Key _source Naglalaman ng dokumentong na-index namin. Hindi ginagamit ng ES ang halagang ito para sa mga operasyon sa paghahanap, dahil ginagamit ang mga index para sa paghahanap. Upang makatipid ng espasyo, iniimbak ng ES ang isang naka-compress na bersyon ng orihinal na dokumento. Kung kailangan lang namin ang ID at hindi ang buong orihinal na dokumento, maaari naming i-disable ang pag-imbak ng orihinal.

Kung hindi namin kailangan ng anumang karagdagang impormasyon, makukuha lang namin ang mga nilalaman ng _source:

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

Maaari ka ring pumili ng ilang partikular na field lang:

# ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅ title
curl -XGET "$ES_URL/blog/post/1?_source=title&pretty"
{
  "_index" : "blog",
  "_type" : "post",
  "_id" : "1",
  "_version" : 1,
  "found" : true,
  "_source" : {
    "title" : "ВСсСлыС котята"
  }
}

Mag-index tayo ng ilan pang mga post at magpatakbo ng mas kumplikadong mga query.

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

Pagsunud-sunod

# Π½Π°ΠΉΠ΄Π΅ΠΌ послСдний пост ΠΏΠΎ Π΄Π°Ρ‚Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ΠΌ поля 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 ]
    } ]
  }
}

Pinili namin ang huling post. size nililimitahan ang bilang ng mga dokumentong ibinigay. total ipinapakita ang kabuuang bilang ng mga dokumentong tumutugma sa query. sort Ang output ay naglalaman ng isang hanay ng mga integer kung saan isinasagawa ang pag-uuri. Iyon ay, ang petsa ay na-convert sa isang integer. Maaari kang magbasa nang higit pa tungkol sa pag-uuri dokumentasyon.

Mga filter at query

Sa halip, ang ES mula noong bersyon 2 ay hindi nakikilala sa pagitan ng mga filter at query ipinakilala ang konsepto ng mga konteksto.
Ang konteksto ng query ay naiiba sa konteksto ng filter dahil ang query ay bumubuo ng isang _score at hindi naka-cache. Ipapaliwanag ko kung ano ang _score mamaya.

I-filter ayon sa petsa

Gamit ang query saklaw sa konteksto ng filter:

# ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ посты, ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ 1ΠΎΠ³ΠΎ сСнтября ΠΈΠ»ΠΈ ΠΏΠΎΠ·ΠΆΠ΅
curl -XGET "$ES_URL/blog/post/_search?pretty" -d'
{
  "filter": {
    "range": {
      "published_at": { "gte": "2014-09-01" }
    }
  }
}'

I-filter ayon sa mga tag

Gumamit tanong ng termino Upang maghanap ng mga ID ng dokumento na naglalaman ng isang ibinigay na salita:

# Π½Π°ΠΉΠ΄Π΅ΠΌ всС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π² ΠΏΠΎΠ»Π΅ 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" : [ "котята" ]
      }
    } ]
  }
}

Buong paghahanap ng teksto

Ang aming tatlong dokumento ay naglalaman ng sumusunod sa field ng nilalaman:

  • <p>БмСшная история ΠΏΡ€ΠΎ котят<p>
  • <p>БмСшная история ΠΏΡ€ΠΎ Ρ‰Π΅Π½ΠΊΠΎΠ²<p>
  • <p>Π”ΡƒΡˆΠ΅Ρ€Π°Π·Π΄ΠΈΡ€Π°ΡŽΡ‰Π°Ρ история ΠΏΡ€ΠΎ Π±Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΡ‚Π΅Π½ΠΊΠ° с ΡƒΠ»ΠΈΡ†Ρ‹<p>

Gumamit tugmang query Upang maghanap ng mga ID ng dokumento na naglalaman ng isang ibinigay na salita:

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

Gayunpaman, kung hahanapin namin ang "mga kuwento" sa field ng nilalaman, wala kaming makikita, dahil naglalaman lang ang index ng mga orihinal na salita, hindi ang mga stem nito. Upang magsagawa ng isang kalidad na paghahanap, kailangan naming i-configure ang analyzer.

Field _score nagpapakita kaugnayanKung ang query ay isasagawa sa isang filter na konteksto, ang _score na halaga ay palaging magiging 1, na nangangahulugan na ang filter ay ganap na tumugma.

Mga Analyzer

Mga Analyzer ay kinakailangan upang baguhin ang pinagmulang teksto sa isang hanay ng mga token.
Ang mga analyzer ay binubuo ng isa Tokenizer at ilang mga opsyonal Mga TokenFilterMaaaring mauna ang Tokenizer ng ilan CharFiltersHinahati ng mga tokenizer ang isang source string sa mga token, halimbawa, sa pamamagitan ng mga puwang at mga bantas na character. Maaaring baguhin ng TokenFilters ang mga token, alisin ang mga ito, o magdagdag ng mga bago, halimbawa, sa pamamagitan ng pag-iwan lamang ng salitang stem, pag-aalis ng mga preposisyon, o pagdaragdag ng mga kasingkahulugan. Binabago ng CharFilters ang source string nang buo, halimbawa, sa pamamagitan ng pagtanggal ng mga HTML tag.

Mayroong ilang sa ES karaniwang mga analyzerHalimbawa, isang analyzer Ruso.

Samantalahin natin api at tingnan natin kung paano binago ng mga karaniwang parser at Ruso ang string na "Nakakatawang kwento tungkol sa mga kuting":

# ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ 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
  } ]
}

Hinati ng karaniwang analyzer ang string sa mga puwang at ginawang lowercase ang lahat, inalis ng Russian analyzer ang mga hindi mahalagang salita, ginawa itong lowercase, at iniwan ang salitang stems.

Tingnan natin kung aling Tokenizer, TokenFilters, at CharFilters ang ginagamit ng Russian analyzer:

{
  "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 ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ */
    }
  }
}

Ilarawan natin ang sarili nating Russian-based na analyzer na mag-aalis ng mga HTML tag. Tatawagin namin itong default, dahil ito ang magiging default na analyzer.

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

Una, ang lahat ng HTML tag ay aalisin mula sa source string, pagkatapos ay hahatiin ito sa mga token ng tokenizer standard, ang mga resultang token ay iko-convert sa lowercase, ang mga hindi gaanong mahalagang salita ay aalisin, at ang natitirang mga token ang magiging ugat ng salita.

Paglikha ng index

Sa itaas, inilarawan namin ang default na analyzer. Ilalapat ito sa lahat ng mga string field. Ang aming post ay naglalaman ng isang hanay ng mga tag, kaya ang mga tag ay ipoproseso din ng analyzer. Dahil naghahanap kami ng mga post na tumutugma sa eksaktong tag, kailangan naming i-disable ang pagsusuri para sa field na "mga tag."

Gumawa tayo ng index ng blog2 na may analyzer at pagmamapa, kung saan hindi pinagana ang pagsusuri ng field ng mga tag:

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

Idagdag natin ang parehong tatlong post sa index na ito (blog2). Laktawan ko ang prosesong ito, dahil ito ay katulad ng pagdaragdag ng mga dokumento sa index ng blog.

Full-text na paghahanap na may suporta sa expression

Kilalanin natin ang isa pang uri ng query:

# Π½Π°ΠΉΠ΄Π΅ΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… встрСчаСтся слово 'истории'
# 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"
      ]
    }
  }
}'

Dahil gumagamit kami ng analyzer na may Russian stemming, ibabalik ng query na ito ang lahat ng dokumento, kahit na naglalaman lang ang mga ito ng salitang 'history'.

Ang query ay maaaring maglaman ng mga espesyal na character, halimbawa:

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

Syntax ng query:

+ 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 поста ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ²

sanggunian

PS

Kung interesado ka sa mga katulad na artikulo ng tutorial, may mga ideya para sa mga bagong artikulo, o may anumang mga mungkahi sa pakikipagtulungan, ikalulugod kong makarinig mula sa iyo sa pamamagitan ng pribadong mensahe o email sa m.kuzmin+habr@darkleaf.ru.

Pinagmulan: www.habr.com