Elasticsearch Analyzers
Bài đăng này đã không được cập nhật trong 6 năm
I. Introduction
Có lẽ khi làm việc với elasticsearch chúng ta đều đã ít nhiều từng nghe về analyzer
, đây có thể được hiểu như là một công cụ của elasticsearch trong việc bẻ từ và cấu trúc dữ liệu giúp cho việc tìm kiếm text, khi chúng ta làm việc với text dưới các ngôn ngữ các khau. Elasticsearch có hỗ trợ sẵn khá nhiều analyzer cho các ngôn ngữ khác nhau, tuy nhiên với tiếng việt thì chúng ta cần phải cài thêm plugin mới sử dụng được (vi_analyzer của anh duy đỗ
). Hôm nay chúng ta sẽ tìm hiểu xem analyzer
gồm những gì và cách sử dụng ra sao.
II. Analyzers
Như bạn có thể biết Elasticsearch
cung cấp cách để tùy chỉnh cách mọi thứ được lập chỉ mục với các trình phân tích của index analysis module
. Analyzers
là cách mà quy trình Lucene và lập chỉ mục dữ liệu. Mỗi analyzer bao gồm:
- 0 or more CharFilters
- 1 Tokenizer
- 0 or more TokenFilters
Tokenizers
được sử dụng để tách một chuỗi thànhstream of tokens
. Ví dụ: Mộtbasic Tokenizer
sẽ thực hiện các thao tác sau:
"Our goal at Tryolabs is to help Startups"
-> Tokenizer ->
["Our", "goal", "at", Tryolabs", "is", "to", "help", "Startups"]
Tokenizers
mặt khác chấp nhận basic Tokenizer
và có thể sửa đổi, xóa chúng hoặc thêm new tokens
. Ví dụ để đặt tên sao cho có nhiều ý nghĩa nhất có thể, một TokenFilter có thể áp dụng stemming
, remove stop words
, add synonyms
.
Chúng ta sẽ không tập trung vào CharFilters
vì chúng được sử dụng để xử lý trước các ký tự trước khi được gửi tới Tokenizers
.
Elasticsearch
cung cấp rất nhiều Tokenizers
, TokenFilters
và chúng ta có thể tạo các tùy chỉnh và cài đặt chúng dưới dạng plugin.
III. How to use Analyzers
Để sử dụng các kết hợp khác nhau của Tokenizers
và TokenFilters
, chúng ta cần tạo một Analyzer
trong index settings
và sau đó sử dụng nó trong mapping
.
Ví dụ, giả sử chúng ta muốn một Analyzer
để tokenize
dưới dạng tiêu chuẩn, và áp dụng bộ lọc lowercase filter
và stemming
.
{
"settings": {
"analysis": {
"filter": {
"custom_english_stemmer": {
"type": "stemmer",
"name": "english"
}
},
"analyzer": {
"custom_lowercase_stemmed": {
"tokenizer": "standard",
"filter": [
"lowercase",
"custom_english_stemmer"
]
}
}
}
},
"mappings": {
"test": {
"properties": {
"text": {
"type": "string",
"analyzer": "custom_lowercase_stemmed"
}
}
}
}
}
Ở trên, chúng ta có hai settings
và mapping
chính. Settings
là nơi tất cả các cài đặt mà index
cần và mappings
là nơi bạn sử dụng các cài đặt cho index
.
Trước tiên hãy tập trung vào settings
. Có rất nhiều index settings
có thể có, replica settings
, read settings
, cache settings
và các cài đặt analysis settings
mà chúng ta có thể quan tâm.
Trong analysis json
, chúng ta có cả analyzers
và filter
được xác định. Khi sử dụng custom analyzer
, một số bộ lọc cần phải được define trước thì mới có thể sử dụng được.
{
"custom_english_stemmer": {
"type": "stemmer",
"name": "english"
}
}
{
"analyzer": {
"custom_lowercase_stemmed": {
"tokenizer": "standard",
"filter": [
"lowercase",
"custom_english_stemmer"
]
}
}
}
Ở đây chúng ta đặt tên cho analyzer
là custom_lowercase_stemmed
nhưng bạn có thể đặt bất kỳ tên nào bạn muốn. Trong ví dụ này, chúng ta đang sử dụng trình tokenizer
"standard" và xác định danh sách các bộ lọc được sử dụng.
lowercase
là bộ lọc được cung cấp bởiElasticsearch
mà không cần cấu hình thêm.custom_english_stemmer
là cái mà chúng ta đã custom.
Thứ tự của danh sách là quan trọng vì nó sẽ là thứ tự các tokens
được xử lý trong index
.
Cuối cùng, chúng ta có thể sử dụng analyzer
mới được tạo ra này trong mappings
.
{
"mappings": {
"test": {
"properties": {
"text": {
"type": "string",
"analyzer": "custom_lowercase_stemmed"
}
}
}
}
}
IV. Testing the analyzer
Chúng ta có ví dụ như sau:
curl http://192.168.59.103:9200/tryoindex/_analyze?analyzer=custom_lowercase_stemmed \
-d 'Tryolabs running monkeys KANGAROOS and jumping elephants'
{
"tokens": [
{
"token": "tryolab",
"start_offset": 0,
"end_offset": 9,
"type": "",
"position": 1
},
{
"token": "run",
"start_offset": 10,
"end_offset": 17,
"type": "",
"position": 2
},
{
"token": "monkei",
"start_offset": 18,
"end_offset": 25,
"type": "",
"position": 3
},
{
"token": "kangaroo",
"start_offset": 26,
"end_offset": 35,
"type": "",
"position": 4
},
{
"token": "and",
"start_offset": 36,
"end_offset": 39,
"type": "",
"position": 5
},
{
"token": "jump",
"start_offset": 40,
"end_offset": 47,
"type": "",
"position": 6
},
{
"token": "eleph",
"start_offset": 48,
"end_offset": 57,
"type": "",
"position": 7
}
]
}
Original | Lowercase & stemming |
---|---|
Tryolabs | tryolab |
running | run |
monkeys | monkei |
KANGAROOS | kangaroo |
and | and |
jumping | jump |
elephants | eleph |
V. Querying using the analyzer
Ví dụ, chúng ta có index:
{
"text": "JOHN LIKES RUNNING IN THE RAIN"
}
Truy vấn như sau:
curl -XGET ‘http://127.0.0.1:9200/tryoindex/test/_search’ -d '
{
"query": {
"match": {
"text": "run"
}
}
}
Kết quả chúng ta nhận được:
{
"took": 25,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.5,
"hits": [
{
"_index": "tryoindex",
"_type": "test",
"_id": "AUtgVQpqJh3uf--po6Ij",
"_score": 0.5,
"_source": {
"text": "john likes running"
}
}
]
}
}
VI. Conclusion
Trên đây là một vài khái niệm và cách sử dụng analyzers, hi vọng sẽ có ích với mọi người.
VII. References
All rights reserved