Pengenalan Cepat ke Pencarian Teks Lengkap dengan ElasticSearch

Ketekunan teratas

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

Kueri pencarian teks lengkap dan melakukan pencarian linguistik terhadap dokumen. Ini mencakup satu atau beberapa kata atau frasa dan mengembalikan dokumen yang sesuai dengan kondisi pencarian.

ElasticSearch adalah mesin pencari berbasis Apache Lucene, perpustakaan perangkat lunak pengambilan informasi sumber terbuka dan gratis. Ini menyediakan mesin pencari teks lengkap terdistribusi dengan antarmuka web HTTP dan dokumen JSON bebas skema.

Artikel ini membahas ElasticSearch REST API dan mendemonstrasikan operasi dasar hanya menggunakan permintaan HTTP.

2. Penyiapan

Untuk menginstal ElasticSearch di komputer Anda, lihat panduan penyiapan resmi.

RESTfull API berjalan pada port 9200. Mari kita uji apakah itu berjalan dengan benar menggunakan perintah curl berikut:

curl -XGET '//localhost:9200/'

Jika Anda mengamati respons berikut, instance tersebut berjalan dengan benar:

{ "name": "NaIlQWU", "cluster_name": "elasticsearch", "cluster_uuid": "enkBkWqqQrS0vp_NXmjQMQ", "version": { "number": "5.1.2", "build_hash": "c8c4c16", "build_date": "2017-01-11T20:18:39.146Z", "build_snapshot": false, "lucene_version": "6.3.0" }, "tagline": "You Know, for Search" }

3. Mengindeks Dokumen

ElasticSearch berorientasi pada dokumen. Ini menyimpan dan mengindeks dokumen. Pengindeksan membuat atau memperbarui dokumen. Setelah pengindeksan, Anda dapat mencari, mengurutkan, dan memfilter dokumen lengkap — bukan baris data berkolom. Ini adalah cara berpikir yang sangat berbeda tentang data dan merupakan salah satu alasan ElasticSearch dapat melakukan penelusuran teks lengkap yang kompleks.

Dokumen direpresentasikan sebagai objek JSON. Serialisasi JSON didukung oleh sebagian besar bahasa pemrograman dan telah menjadi format standar yang digunakan oleh gerakan NoSQL. Sederhana, ringkas, dan mudah dibaca.

Kami akan menggunakan entri acak berikut untuk melakukan pencarian teks lengkap kami:

{ "title": "He went", "random_text": "He went such dare good fact. The small own seven saved man age." } { "title": "He oppose", "random_text": "He oppose at thrown desire of no. \ Announcing impression unaffected day his are unreserved indulgence." } { "title": "Repulsive questions", "random_text": "Repulsive questions contented him few extensive supported." } { "title": "Old education", "random_text": "Old education him departure any arranging one prevailed." }

Sebelum kita dapat mengindeks dokumen, kita perlu memutuskan di mana menyimpannya. Ada kemungkinan untuk memiliki banyak indeks, yang pada gilirannya berisi banyak jenis. Jenis ini menampung banyak dokumen, dan setiap dokumen memiliki banyak bidang.

Kami akan menyimpan dokumen kami menggunakan skema berikut:

teks : Nama indeks.

Artikel : Nama tipe.

id : ID dari entri teks contoh khusus ini.

Untuk menambahkan dokumen kita akan menjalankan perintah berikut:

curl -XPUT 'localhost:9200/text/article/1?pretty' -H 'Content-Type: application/json' -d ' { "title": "He went", "random_text": "He went such dare good fact. The small own seven saved man age." }'

Di sini kami menggunakan id = 1 , kami dapat menambahkan entri lain menggunakan perintah yang sama dan id yang bertambah.

4. Mengambil Dokumen

Setelah kami menambahkan semua dokumen kami, kami dapat memeriksa berapa banyak dokumen, menggunakan perintah berikut, yang kami miliki di cluster:

curl -XGET '//localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } }' 

Juga, kita bisa mendapatkan dokumen menggunakan idnya dengan perintah berikut:

curl -XGET 'localhost:9200/text/article/1?pretty' 

Dan kita harus mendapatkan jawaban berikut dari pencarian elastis:

{ "_index": "text", "_type": "article", "_id": "1", "_version": 1, "found": true, "_source": { "title": "He went", "random_text": "He went such dare good fact. The small own seven saved man age." } }

Seperti yang kita lihat, jawaban ini sesuai dengan entri yang ditambahkan menggunakan id 1.

5. Menanyakan Dokumen

OK mari kita lakukan pencarian teks lengkap dengan perintah berikut:

curl -XGET 'localhost:9200/text/article/_search?pretty' -H 'Content-Type: application/json' -d ' { "query": { "match": { "random_text": "him departure" } } }'

Dan kami mendapatkan hasil sebagai berikut:

{ "took": 32, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 2, "max_score": 1.4513469, "hits": [ { "_index": "text", "_type": "article", "_id": "4", "_score": 1.4513469, "_source": { "title": "Old education", "random_text": "Old education him departure any arranging one prevailed." } }, { "_index": "text", "_type": "article", "_id": "3", "_score": 0.28582606, "_source": { "title": "Repulsive questions", "random_text": "Repulsive questions contented him few extensive supported." } } ] } }

Seperti yang bisa kita lihat, kita mencari "kepergiannya" dan kita mendapatkan dua hasil dengan skor berbeda. Hasil pertama jelas karena teks memiliki penelusuran yang dilakukan di dalamnya dan seperti yang bisa kita lihat, kita memiliki skor 1,4513469 .

Hasil kedua diambil karena dokumen target berisi kata “dia”.

Secara default, ElasticSearch mengurutkan hasil yang cocok menurut skor relevansinya, yaitu, seberapa cocok setiap dokumen dengan kueri. Perhatikan, bahwa skor hasil kedua relatif kecil terhadap klik pertama, menunjukkan relevansi yang lebih rendah.

6. Pencarian Fuzzy

Pencocokan fuzzy memperlakukan dua kata yang “tidak jelas” serupa seolah-olah keduanya adalah kata yang sama. Pertama, kita perlu mendefinisikan apa yang kita maksud dengan ketidakjelasan.

Elasticsearch mendukung jarak edit maksimum, ditentukan dengan parameter ketidakjelasan, 2. Parameter ketidakjelasan dapat disetel ke AUTO, yang menghasilkan jarak edit maksimum berikut:

  • 0 untuk string dengan satu atau dua karakter
  • 1 untuk string tiga, empat, atau lima karakter
  • 2 untuk string lebih dari lima karakter

you may find that an edit distance of 2 returns results that don’t appear to be related.

You may get better results, and better performance, with a maximum fuzziness of 1. Distance refers to the Levenshtein distance that is a string metric for measuring the difference between two sequences. Informally, the Levenshtein distance between two words is the minimum number of single-character edits.

OK let's perform our search with fuzziness:

curl -XGET 'localhost:9200/text/article/_search?pretty' -H 'Content-Type: application/json' -d' { "query": { "match": { "random_text": { "query": "him departure", "fuzziness": "2" } } } }'

And here's the result:

{ "took": 88, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 4, "max_score": 1.5834423, "hits": [ { "_index": "text", "_type": "article", "_id": "4", "_score": 1.4513469, "_source": { "title": "Old education", "random_text": "Old education him departure any arranging one prevailed." } }, { "_index": "text", "_type": "article", "_id": "2", "_score": 0.41093433, "_source": { "title": "He oppose", "random_text": "He oppose at thrown desire of no. \ Announcing impression unaffected day his are unreserved indulgence." } }, { "_index": "text", "_type": "article", "_id": "3", "_score": 0.2876821, "_source": { "title": "Repulsive questions", "random_text": "Repulsive questions contented him few extensive supported." } }, { "_index": "text", "_type": "article", "_id": "1", "_score": 0.0, "_source": { "title": "He went", "random_text": "He went such dare good fact. The small own seven saved man age." } } ] } }'

As we can see the fuzziness give us more results.

We need to use fuzziness carefully because it tends to retrieve results that look unrelated.

7. Conclusion

In this quick tutorial we focused on indexing documents and querying Elasticsearch for full-text search, directly via it's REST API.

Kami, tentu saja, memiliki API yang tersedia untuk berbagai bahasa pemrograman saat kami membutuhkannya - tetapi API tersebut masih cukup nyaman dan bahasa agnostik.

Ketekunan bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya