Dasar-dasar Pencarian Elastis

Elasticsearch adalah mesin pencari dengan json rest api, menggunakan Lucene dan ditulis dalam Java. Penjelasan tentang semua kelebihan mesin ini tersedia di situs resmi. Berikut ini kita akan menyebut Elasticsearch sebagai ES.

Mesin serupa digunakan untuk pencarian kompleks dalam database dokumen. Misalnya pencarian berdasarkan morfologi bahasa atau pencarian berdasarkan koordinat geografis.

Pada artikel kali ini saya akan membahas tentang dasar-dasar ES dengan menggunakan contoh pengindeksan postingan blog. Saya akan menunjukkan cara memfilter, mengurutkan, dan mencari dokumen.

Agar tidak bergantung pada sistem operasi, saya akan membuat semua permintaan ke ES menggunakan CURL. Ada juga plugin untuk google chrome bernama rasa.

Teks tersebut berisi tautan ke dokumentasi dan sumber lain. Di bagian akhir terdapat tautan untuk akses cepat ke dokumentasi. Definisi istilah asing dapat ditemukan di оссарии.

Instalasi

Untuk melakukan ini, pertama-tama kita memerlukan Java. Pengembang Sarankan instal versi Java yang lebih baru dari pembaruan Java 8 20 atau pembaruan Java 7 55.

Distribusi ES tersedia di situs pengembang. Setelah membongkar arsip yang perlu Anda jalankan bin/elasticsearch. Juga tersedia paket untuk apt dan yum. Ada gambar resmi untuk buruh pelabuhan. Lebih lanjut tentang instalasi.

Setelah instalasi dan peluncuran, mari kita periksa fungsinya:

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

curl -X GET $ES_URL

Kami akan menerima sesuatu seperti ini:

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

Pengindeksan

Mari tambahkan postingan ke 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"
}'

respons server:

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

ES otomatis dibuat indeks blog dan Ketik pos. Kita dapat menggambar analogi kondisional: indeks adalah database, dan tipe adalah tabel dalam database ini. Setiap jenis memiliki skemanya sendiri - pemetaan, seperti tabel relasional. Pemetaan dihasilkan secara otomatis ketika dokumen diindeks:

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

Dalam respons server, saya menambahkan nilai bidang dokumen yang diindeks di komentar:

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

Perlu dicatat bahwa ES tidak membedakan antara nilai tunggal dan serangkaian nilai. Misalnya, bidang judul hanya berisi judul, dan bidang tag berisi larik string, meskipun direpresentasikan dengan cara yang sama dalam pemetaan.
Kita akan membicarakan lebih banyak tentang pemetaan nanti.

Pertanyaan

Mengambil dokumen berdasarkan idnya:

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

Kunci baru muncul di respons: _version ΠΈ _source. Secara umum, semua kunci dimulai dengan _ tergolong resmi.

ΠšΠ»ΡŽΡ‡ _version menunjukkan versi dokumen. Hal ini diperlukan agar mekanisme penguncian optimis dapat bekerja. Misal kita ingin mengubah dokumen yang memiliki versi 1. Kita submit dokumen yang diubah tersebut dan menandakan bahwa ini merupakan editan dari dokumen dengan versi 1. Jika ada orang lain yang juga mengedit dokumen dengan versi 1 dan mengajukan perubahan sebelum kita, maka ES tidak akan menerima perubahan kita, karena itu menyimpan dokumen dengan versi 2.

ΠšΠ»ΡŽΡ‡ _source berisi dokumen yang kami indeks. ES tidak menggunakan nilai ini untuk operasi pencarian karena Indeks digunakan untuk mencari. Untuk menghemat ruang, ES menyimpan dokumen sumber terkompresi. Jika kita hanya membutuhkan id saja, dan bukan seluruh dokumen sumber, maka kita dapat menonaktifkan penyimpanan sumber.

Jika tidak membutuhkan informasi tambahan, kita hanya bisa mendapatkan isi _source saja:

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

Anda juga dapat memilih bidang tertentu saja:

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

Mari indeks beberapa postingan lagi dan jalankan kueri yang lebih kompleks.

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

Sortir

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

Kami memilih posting terakhir. size membatasi jumlah dokumen yang akan diterbitkan. total menunjukkan jumlah total dokumen yang cocok dengan permintaan. sort dalam output berisi array bilangan bulat yang digunakan untuk menyortir. Itu. tanggal diubah menjadi bilangan bulat. Anda dapat membaca lebih lanjut tentang pengurutan dokumentasi.

Filter dan kueri

ES sejak versi 2 tidak membedakan antara filter dan kueri konsep konteks diperkenalkan.
Konteks kueri berbeda dari konteks filter karena kueri menghasilkan _score dan tidak disimpan dalam cache. Saya akan menunjukkan kepada Anda apa itu _score nanti.

Filter berdasarkan tanggal

Kami menggunakan permintaan tersebut jarak dalam konteks filter:

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

Filter berdasarkan tag

Gunakan istilah kueri untuk mencari id dokumen yang mengandung kata tertentu:

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

Pencarian teks lengkap

Tiga dokumen kami berisi hal berikut di bidang konten:

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

Gunakan kueri yang cocok untuk mencari id dokumen yang mengandung kata tertentu:

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

Namun jika kita mencari β€œcerita” di kolom konten, kita tidak akan menemukan apa pun, karena Indeks hanya berisi kata-kata asli, bukan kata dasar. Untuk melakukan pencarian berkualitas tinggi, Anda perlu mengkonfigurasi penganalisis.

Lapangan _score acara relevansi. Jika permintaan dijalankan dalam konteks filter, maka nilai _score akan selalu sama dengan 1, yang berarti filter benar-benar cocok.

Penganalisis

Penganalisis diperlukan untuk mengubah teks sumber menjadi sekumpulan token.
Alat analisa terdiri dari satu Tokenizer dan beberapa opsional Filter Token. Tokenizer mungkin didahului oleh beberapa Filter Char. Tokenizer memecah string sumber menjadi token, seperti spasi dan karakter tanda baca. TokenFilter dapat mengubah token, menghapus atau menambahkan yang baru, misalnya menyisakan kata dasar saja, menghilangkan preposisi, menambahkan sinonim. CharFilter - mengubah seluruh string sumber, misalnya, memotong tag html.

ES memiliki beberapa penganalisis standar. Misalnya saja alat analisa Rusia.

Mari manfaatkan api dan mari kita lihat bagaimana penganalisis standar dan Rusia mengubah string β€œCerita lucu tentang anak kucing”:

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

Penganalisis standar membagi string menjadi spasi dan mengubah semuanya menjadi huruf kecil, penganalisis Rusia menghapus kata-kata yang tidak penting, mengubahnya menjadi huruf kecil dan meninggalkan batang kata.

Mari kita lihat Tokenizer, TokenFilters, CharFilters mana yang digunakan oleh penganalisis 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 ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ */
    }
  }
}

Mari kita jelaskan penganalisis kami berdasarkan bahasa Rusia, yang akan memotong tag html. Sebut saja default, karena penganalisis dengan nama ini akan digunakan secara default.

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

Pertama, semua tag HTML akan dihapus dari string sumber, kemudian standar tokenizer akan membaginya menjadi token, token yang dihasilkan akan dipindahkan ke huruf kecil, kata-kata yang tidak penting akan dihapus, dan token yang tersisa akan tetap menjadi batang kata.

Membuat indeks

Di atas kami menjelaskan penganalisis default. Ini akan berlaku untuk semua bidang string. Postingan kami berisi serangkaian tag, sehingga tag tersebut juga akan diproses oleh penganalisis. Karena Kami mencari postingan dengan pencocokan persis dengan sebuah tag, lalu kami perlu menonaktifkan analisis untuk bidang tag.

Mari kita buat indeks blog2 dengan penganalisis dan pemetaan, di mana analisis bidang tag dinonaktifkan:

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

Mari tambahkan 3 postingan yang sama ke indeks ini (blog2). Saya akan menghilangkan proses ini karena... ini mirip dengan menambahkan dokumen ke indeks blog.

Pencarian teks lengkap dengan dukungan ekspresi

Mari kita lihat jenis permintaan lainnya:

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

Karena Kami menggunakan penganalisa dengan stemming Rusia, maka permintaan ini akan mengembalikan semua dokumen, meskipun hanya berisi kata 'sejarah'.

Permintaan mungkin berisi karakter khusus, misalnya:

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

Sintaks permintaan:

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

referensi

PS

Jika Anda tertarik dengan artikel-pelajaran serupa, mempunyai ide untuk artikel baru, atau mempunyai usulan kerjasama, maka saya akan dengan senang hati menerima pesan melalui pesan pribadi atau email. [email dilindungi].

Sumber: www.habr.com