ElasticSearch & php & mysql thực hành – Phần 6

https://thinhpc86.wordpress.com/2015/06/11/elasticsearch-php-mysql-thuc-hanh-phan-6/

1. Term Filter

Filters documents that have fields that contain a term (not analyzed). Similar to term query, except that it acts as a filter. Can be placed within queries that accept a filter, for example:

Lọc các tài liệu có các trường chứa một thuật ngữ (không được phân tích). Tương tự như truy vấn thuật ngữ, ngoại trừ việc nó hoạt động như một bộ lọc. Có thể được đặt trong các truy vấn chấp nhận bộ lọc, ví dụ:

{
    "constant_score" : {
        "filter" : {
            "term" : { "user" : "kimchy"}
        }
    }
}

Caching

The result of the filter is automatically cached by default. The _cache can be set to false to turn it off. Here is an example:

Kết quả của bộ lọc được tự động lưu vào bộ nhớ cache theo mặc định. _Cache có thể được đặt thành false để tắt nó. Đây là một ví dụ:

{
    "constant_score" : {
        "filter" : {
            "term" : {
                "user" : "kimchy",
                "_cache" : false
            }
        }
    }
}

2. Terms Filter

Filters documents that have fields that match any of the provided terms (not analyzed). For example:

Lọc các tài liệu có các trường phù hợp với bất kỳ điều khoản nào được cung cấp (không được phân tích). Ví dụ:

{
    "constant_score" : {
        "filter" : {
            "terms" : { "user" : ["kimchy", "elasticsearch"]}
        }
    }
}

Bộ lọc thuật ngữ cũng được đặt bí danh là tên bộ lọc để sử dụng đơn giản hơn.

Execution Mode

Cách bộ lọc điều khoản thực thi là bằng cách lặp lại các điều khoản được cung cấp và tìm các tài liệu phù hợp (tải vào tập bit) và lưu vào bộ nhớ đệm. Đôi khi, chúng tôi muốn một mô hình thực thi khác vẫn có thể đạt được bằng cách xây dựng các truy vấn phức tạp hơn trong DSL, nhưng chúng tôi có thể hỗ trợ chúng trong mô hình nhỏ gọn hơn mà bộ lọc điều khoản cung cấp.

Tùy chọn thực thi hiện có các tùy chọn sau:

3. Prefix Filter

Lọc các tài liệu có các trường chứa các cụm từ có tiền tố được chỉ định (không được phân tích). Tương tự như truy vấn tiền tố, ngoại trừ việc nó hoạt động như một bộ lọc. Có thể được đặt trong các truy vấn chấp nhận một bộ lọc.

{
    "constant_score" : {
        "filter" : {
            "prefix" : { "user" : "ki" }
        }
    }
}

Caching

Kết quả của bộ lọc được lưu vào bộ nhớ cache theo mặc định. _Cache có thể được đặt thành false để không lưu vào bộ nhớ cache. Đây là một ví dụ:

{
    "constant_score" : {
        "filter" : {
            "prefix" : {
                "user" : "ki",
                "_cache" : false
            }
        }
    }
}

4. Range Filter

Lọc tài liệu với các trường có các thuật ngữ trong một phạm vi nhất định. Tương tự như truy vấn phạm vi, ngoại trừ việc nó hoạt động như một bộ lọc. Có thể được đặt trong các truy vấn chấp nhận một bộ lọc.

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

ElasticSearch & php & mysql thực hành – Phần 6

June 11, 2015 thinhpc86 Java, PHPElasticSearch, Java, Search Engine

Khi ta thực hiện tìm kiếm bằng lệnh search, kết quả trả về luôn có _score, score càng cao thì độ phù hợp càng lớn. Nếu ta ko quan tâm tới score, có 1 cách khác để tìm kiếm nhanh hơn, đó là dùng Filter, bởi 2 lý do: – Không tính điểm score nên nhanh hơn – Có thể cache, nên những câu truy vấn lặp lại sẽ nhanh hơn nhiều

Filtered query: Ví dụ này dùng filtered query để trả về tất cả accounts với balances trong khoảng 20000 và 30000

 curl -XPOST 'localhost:9200/bank/_search?pretty' -H "Content-Type: application/json" -d '
{
  "query": {
          "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
    }
  }
}'

Đây chỉ là 1 ví dụ nhỏ dùng filter. Có rất nhiều kiểu filter hay query, thời điểm này ta chưa đi sâu tìm hiểu cụ thể. Filter làm mọi thứ mà query có thể. Khi nào bạn chỉ cần trả về kết quả, chỉ cần quan tâm là nó có hay không mà ko cần biết đến độ phù hợp, thì hãy dùng filter!

Chi tiết về Filter có thể xem ở đây:

https://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-filters.html

Executing Aggregations(GROUP BY)

ES cũng cung cấp cho bạn 1 công cụ để thực hiện Group By trong trường hợp bạn muốn thống kê 1 hay nhiều thông số nào đó. Trong ES, bạn có khả năng thực thi search để trả về kết quả đồng thời trả về những thống kê bạn muốn chỉ trong 1 lần gọi API đơn giản. Khả năng này mạnh hơn SQL rất nhiều vì bạn chỉ cần gọi 1 lần để thực hiện câu query phức tạp với nhiều thống kê, rất nhẹ, nhanh và hiệu quả.

Để bắt đầu, ví dụ dưới đây sẽ group tất cả các accounts theo state và trả về top 10(default) states sắp xếp theo số lượng giảm dần(cũng là default luôn):

1234567891011

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" } } }}'

Trong SQL, thì câu aggregation(Agg) trên giống như:

1

SELECT COUNT(*) from bank GROUP BY state ORDER BY COUNT(*) DESC

Lưu ý: Trong câu Agg trên, ta để size=0 là để ko hiển thị kết quả search, chỉ hiện thị kết quả Agg để lấy thống kê.

Tiếp theo ta sẽ tính trung bình balance của các account group by theo từng bang:

123456789101112131415161718

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_state": { "terms": { "field": "state" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } }}'

Ta thấy có 2 aggs lồng nhau để làm được điều này. Và nó tương đương trong SQL:

1

SELECT AVG(balance) as "average_balance" from bank GROUP BY state ORDER BY COUNT(*) DESC

Ví dụ dưới đây cho ta thấy cách để ta có thể group by những khoảng tuổi (ages 20-29, 30-39, and 40-49), sau đó lại group by theo giới tính(gender) và cuối cùng lấy trung bình lương của các account/khoảng/gender:

123456789101112131415161718192021222324252627282930313233343536373839

curl -XPOST 'localhost:9200/bank/_search?pretty' -d '{ "size": 0, "aggs": { "group_by_age": { "range": { "field": "age", "ranges": [ { "from": 20, "to": 30 }, { "from": 30, "to": 40 }, { "from": 40, "to": 50 } ] }, "aggs": { "group_by_gender": { "terms": { "field": "gender" }, "aggs": { "average_balance": { "avg": { "field": "balance" } } } } } } }}'

Có rất nhiều kiểu group by khác ta ko đi chi tiết ở đây. Xem thêm ở link sau: https://www.elastic.co/guide/en/elasticsearch/reference/1.5/search-aggregations.html

Nguồn:

https://www.elastic.co/guide/en/elasticsearch/reference/1.5/_executing_filters.html

Last updated