Công Cụ tìm kiếm và phân tích dữ liệu - ElasticSearch

ElasticSearch là gì?

ES là phần mềm tìm kiếm và trả về thông tin nó cũng là một document oriented database. Nhiệm vụ của nó chính là store và retrieve document. Trong ES, tất cả các document được hiển thị trong JSON format. Nó được xây dựng trên apache Lucene ES thực sự đặc biệt chính là nhờ vào khả năng phục hồi thông tin của nó. Sự kết hợp của storage và querying/aggregation service đã làm cho ES thực sự đặc biệt và khác xa 1 công cụ chỉ lưu trữ văn bản.

Một số trường hợp nên sử dụng ES:

  • Tìm kiếm text thông thường
  • Tìm kiếm text và dữ liệu có cấu trúc
  • Tổng hợp dữ liệu

Ưu điểm của ES:

  • ES có perfomance rất tốt
  • có khả năng khả năng mở rộng truy vấn song song bên trong một cluster
  • ElasticSearch là có thể sắp xếp kết quả truy vấn theo Relevance, theo mặc định, ES sử dụng thuật toán TF/IDF

Nhược điểm của ES:

  • nó không có bất kỳ transactional operations nào cả
  • sẽ không tốt nếu như dùng trong một môi trường thường xuyên ghi dữ liệu

cách sử dụng một số query tìm kiếm cơ bản:

cú pháp query cơ bản:

{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

hoặc có thể dùng:

{
  "query": {
    "match": {
      "FIELD": {
        "query": "TEXT",
        "OPTION": "VALUE"
      }
    }
  }
}

full search: Chúng ta có thể ghép nhiều query khác nhau thành một query để trả ra thông tin mà chúng ta mong muốn tìm kiếm: ví dụ:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "smith"
          }
        }
      ],
      "must_not": [
        {
          "match_phrase": {
            "title": "granny smith"
          }
        }
      ],
       "filter": [
        {
          "exists": {
            "field": "title"
          }
        }
      ]
    }
  }
}

truy vấn nhiều trường:

"multi_match": {
  "query": "hailua",
  "fields": ["name", "email"]
}

Giải thích các cú pháp trong query:

  • must: tương ứng với toán tử AND
  • must_not: tương ứng với toán tử NOT
  • should: tương ứng với toán tử OR
  • filter: là điều kiện lọc
"bool": {
  "must": [],
  "must_not": [],
  "filter": [],
  "should": []
}

tìm kiếm theo một khoảng giá trị (ví dụ thời gian, tuổi...)

"range": {
  "age": {
    "gte": 10,
    "lte": 20
  }
}

Analyzer và tokenizer của ES

ES có cách đánh index khá đặc biệt, điều đó sẽ giúp cho việc tìm kiếm không gặp khó khăn ngay cả khi tìm kiếm các ký tự đặc biệt. chúng ta có thể custom điều này, thông qua việc custom lại bộ analayzer của ES.

{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_ngram_analyzer" : {
                    "tokenizer" : "my_ngram_tokenizer"
                }
            },
            "tokenizer" : {
                "my_ngram_tokenizer" : {
                    "type" : "nGram",
                    "token_chars": ["letter", "digit", "whitespace", "punctuation", "symbol"]
                }
            }
        }
    }
}

trong đó các thành phần sẽ cụ thể như sau:

  • letter: Các chữ cái
  • digit: Các chữ số
  • whitespace: Các kí tự khoảng trắng như space và \n
  • punctuation: Các dấu câu như ! và "
  • symbol: Các kí hiệu như @, # và &
  • nGram: sẽ gộp 2 ký tự thành 1 cặp và đánh index cho nó
ví dụ: 
với từ quick. thì sẽ được đánh index như sau: 
[qu, ui, ic, ck]

hoặc có thể dùng type là "edge_ngram" edge_ngram: nó sẽ ghép ký tự đầu tiên của từ với lần lượt các ký tự tiếp theo cho đến hết từ

ví dụ:
với từ quick. thì sẽ được đánh index như sau:
[q, qu, qui, quic, quick]

hoặc có thể dùng kiểu mặc định đó là "standard" standard: nó sẽ tách từng từ trong một câu ra để đánh index.

ví dụ: 
"looking for my self" thì sẽ được đánh index như sau:
[loooking, for, my, self]

Tùy thuộc vào nhu cầu sử dụng của mỗi chúng ta, khi đó sẽ lựa chọn kiểu nào cho phù hợp nhất.

Tóm tắt:

Trên đây là các khái niệm về ES cũng như các query cơ bản của nó. Bài này sẽ giúp các bạn sẽ hiểu rõ hơn về ES, cũng như các query cơ bản khi dùng ES, hy vọng các bạn sẽ vận dụng thành công với từng mục đích của mình!

Tài liệu tham khảo:

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/index.html