**Reference **

1. Elasticsearch, so what’s it?

  • Elasticsearch là một search engine.
  • Elasticsearch được xây dựng để hoạt động như một server cloud theo cơ chế của RESTful.
  • Kế thừa và phát triển từ Lucene Apache.
  • Phát triển bằng ngôn ngữ Java.
  • Là phần mềm open-source được phát hành theo giất phép của Apache License.
  • Tương tự :
    • Solr (Apache).
  • Những ai đã dùng Elasticsearch :
    • Mozilla
    • Quora
    • SoundCloud
    • GitHub
    • Stack Exchange
    • Center for Open Science
    • Reverb
    • Netflix.

2. How does it work?

Indexing

Câu hỏi : Elasticsearch được gọi là real-time search bởi vì khả năng trả lại kết quả tìm kiếm của nó là nhanh chóng, vậy nó hoạt động như nào để có thể được gọi là real-time search?

Trả lời : Thay vì search text, Elasticsearch nó search index, cơ chế này gọi là inverted index

Ví dụ bây h ta tìm kiếm một từ nào đó trong một cuốn sách thì :

  • Search kiểu hàng ngày : lật từng trang và tìm kiếm từng từ trong mỗi trang. tìm trang -> ra text
  • Search kiểu inverted index : lật ngay tới phụ lục (Index table) và tìm các trang có chứa từ đó. tìm text -> ra trang.

Indexes là cơ chế dùng để tìm kiếm nhanh hơn các record trong databse, tránh việc phải đọc toàn bộ các record trong một table

Vậy khi tìm kiếm một bản ghi nào đó trong DB thay vì phải duyệt toàn bộ các bản ghi trong table thì ta sẽ dựa vào index để tìm ra những bản ghi được nhanh hơn, giống như cơ chế tìm một từ trong cuốn sách như trên.

  • Ta sẽ xém xét ví dụ sau để hiểu rõ hơn về inverted index.
  • Ta có 3 document là D1, D2, D3 :
    • D1 = “hom nay troi mua”
    • D2 = “hom nay troi nang”
    • D3 = “mot ngay dep troi”
  • Theo đó ta sẽ có inverted index của 3 document trên là
    • “hom” = {D1, D2}
    • “nay” = {D1, D2}
    • “troi” = {D1, D2, D3}
    • “mua” = {D1}
    • “nang” = {D2}
    • “mot” = {D3}
    • “ngay” = {D3}
    • “dep” = {D3}
  • Ví dụ khi muốn search từ “hom nay” (tùy theo việc là query theo kiểu and hay or thì phép tính toán sẽ khác đi.)
  • Nếu là AND : {D1, D2} ∩ {D1, D2} = {D1, D2}
  • Nếu là OR : {D1, D2} ∪ {D1, D2} = {D1, D2}

3. Installing and running ElasticSearch.

Install

Run

  • TIP: Trong file ~/bash.rc ta export path cho Elasticsearch lệnh để dùng ở mọi nơi.
PATH=$PATH$( find $HOME/Elasticsearch/ -type d -printf ":%p" )

# $HOME/Elasticsearch/ là nơi bạn đặt folder Elastic-search vừa down về ở trên.
  • Chạy Elasticsearch:
$ which elasticsearch
# => /home/leminhtuan/Elasticsearch/elasticsearch-1.6.0/bin/elasticsearch

$ elasticsearch
  • ES sẽ chạy tại địa chỉ : localhost:9200
Screenshot from 2015-07-16 14:18:52.png
  • Kiểm tra kết nối tới server Elasticsearch, nếu thành công ta sẽ thu được chuổi JSON như bên dưới.
Screenshot from 2015-07-16 14:21:38.png
$ curl 0:9200
{
  "status" : 200,
  "name" : "Karl Mordo",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.6.0",
    "build_hash" : "cdd3ac4dde4f69524ec0a14de3828cb95bbb86d0",
    "build_timestamp" : "2015-06-09T13:36:34Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

4. Directory Layout

  • Kiến trúc thư mục của Elasticsearch
  • bin là thư mục chứa những script để start/stop Elasticsearch.
  • conf chứa nững file config
  • data khi ta Indexing (hay là chính là việc insert dữ liệu) thì data sẽ được store ở đây.
  • logs chứa logs
  • plugins plugin mà Slasticsearch dùng.

5. Indexing Data.

  • Như đã biết Elasticsearch là một tool hỗ trợ search thông tin vậy trước khi search ta phải có dữ liệu để search, quá trình Indexing Data giống như việc tạo dữ liệu cho database.
  • Trong quá trình Indexing Data Elasticsearch sẽ thực hiện một cơ chế đánh index nào đó (em k rõ!) để phục vụ cho tìm kiếm sau này.
  • Elasticsearch cung cấp một API hoạt động theo cơ chế của Restful:
    • Method PUT để insert/update dữ liệu
      • curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{"user" : "kimchy"}'
    • Method GET để lấy dữ liệu
      • curl -XGET 'http://localhost:9200/twitter/tweet/1'
    • Method DELETE xóa dữ liệu.
      • curl -XDELETE 'http://localhost:9200/twitter/tweet/1'

Câu Hỏi: Có cách nào để từ một database sẵn có (như đã có một mysql db) ta sẽ dùng Elasticsearch để search những trong Db đó hay bắt buộc phải Indexing Data rồi mới search được ???????????????

Trả lời: Theo em biết thì phải Indexing Data để Elasticsearch tạo index cho từng record được insert rồi mới có thể search. (please corect me if i got wrong !!!)

6. Searching

  • Sau khi đã khởi tạo dữ liệu bằng việc Indexing lúc này ta đã có thể thực hiện search text từ những dữ liệu ta vừa mới Indexing
  • Tìm kiếm bản ghi trong
    • database (index) : blog
    • trong table (type) post
    • trường user có giá trị là “dilber”
$ curl 'http://localhost:9200/blog/post/_search?q=user:dilbert&pretty'
Screenshot from 2015-07-16 14:54:39.png

7. Shutdown.

  • Hit Ctrl+C