Elasticsearch - DSL truy vấn

Trong Elasticsearch, tìm kiếm được thực hiện bằng cách sử dụng truy vấn dựa trên JSON. Một truy vấn được tạo thành từ hai mệnh đề -

  • Leaf Query Clauses - Các mệnh đề này là đối sánh, thuật ngữ hoặc phạm vi, tìm kiếm một giá trị cụ thể trong trường cụ thể.

  • Compound Query Clauses - Các truy vấn này là sự kết hợp của các mệnh đề truy vấn lá và các truy vấn ghép khác để trích xuất thông tin mong muốn.

Elasticsearch hỗ trợ một số lượng lớn các truy vấn. Một truy vấn bắt đầu bằng một từ khóa truy vấn và sau đó có các điều kiện và bộ lọc bên trong dưới dạng đối tượng JSON. Các loại truy vấn khác nhau đã được mô tả bên dưới.

Khớp tất cả truy vấn

Đây là truy vấn cơ bản nhất; nó trả về tất cả nội dung và với điểm 1,0 cho mọi đối tượng.

POST /schools/_search
{
   "query":{
      "match_all":{}
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được kết quả sau:

{
   "took" : 7,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         },
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Truy vấn văn bản đầy đủ

Các truy vấn này được sử dụng để tìm kiếm toàn bộ nội dung như một chương hoặc một bài báo. Truy vấn này hoạt động theo trình phân tích được liên kết với chỉ mục hoặc tài liệu cụ thể đó. Trong phần này, chúng ta sẽ thảo luận về các loại truy vấn toàn văn khác nhau.

Khớp truy vấn

Truy vấn này khớp một văn bản hoặc cụm từ với các giá trị của một hoặc nhiều trường.

POST /schools*/_search
{
   "query":{
      "match" : {
         "rating":"4.5"
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 44,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.47000363,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 0.47000363,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Truy vấn nhiều đối sánh

Truy vấn này khớp với một văn bản hoặc cụm từ với nhiều trường.

POST /schools*/_search
{
   "query":{
      "multi_match" : {
         "query": "paprola",
         "fields": [ "city", "state" ]
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 12,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 0.9808292,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "5",
            "_score" : 0.9808292,
            "_source" : {
               "name" : "Central School",
               "description" : "CBSE Affiliation",
               "street" : "Nagan",
               "city" : "paprola",
               "state" : "HP",
               "zip" : "176115",
               "location" : [
                  31.8955385,
                  76.8380405
               ],
               "fees" : 2200,
               "tags" : [
                  "Senior Secondary",
                  "beautiful campus"
               ],
               "rating" : "3.3"
            }
         }
      ]
   }
}

Truy vấn Chuỗi truy vấn

Truy vấn này sử dụng trình phân tích cú pháp truy vấn và từ khóa query_string.

POST /schools*/_search
{
   "query":{
      "query_string":{
         "query":"beautiful"
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 60,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
      "value" : 1,
      "relation" : "eq"
   },
………………………………….

Truy vấn cấp độ kỳ hạn

Những truy vấn này chủ yếu xử lý dữ liệu có cấu trúc như số, ngày tháng và enums.

POST /schools*/_search
{
   "query":{
      "term":{"zip":"176115"}
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

……………………………..
hits" : [
   {
      "_index" : "schools",
      "_type" : "school",
      "_id" : "5",
      "_score" : 0.9808292,
      "_source" : {
         "name" : "Central School",
         "description" : "CBSE Affiliation",
         "street" : "Nagan",
         "city" : "paprola",
         "state" : "HP",
         "zip" : "176115",
         "location" : [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

Truy vấn phạm vi

Truy vấn này được sử dụng để tìm các đối tượng có giá trị giữa các phạm vi giá trị đã cho. Để làm được điều này, chúng ta cần sử dụng các toán tử như -

  • gte - lớn hơn bằng
  • gt - lớn hơn
  • lte - nhỏ hơn bằng
  • lt - nhỏ hơn

Ví dụ, hãy quan sát đoạn mã dưới đây:

POST /schools*/_search
{
   "query":{
      "range":{
         "rating":{
            "gte":3.5
         }
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 24,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 1,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         {
            "_index" : "schools",
            "_type" : "school",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
               "name" : "City Best School",
               "description" : "ICSE",
               "street" : "West End",
               "city" : "Meerut",
               "state" : "UP",
               "zip" : "250002",
               "location" : [
                  28.9926174,
                  77.692485
               ],
               "fees" : 3500,
               "tags" : [
                  "fully computerized"
               ],
               "rating" : "4.5"
            }
         }
      ]
   }
}

Tồn tại các loại truy vấn cấp thuật ngữ khác, chẳng hạn như -

  • Exists query - Nếu một trường nào đó có giá trị khác rỗng.

  • Missing query - Điều này hoàn toàn ngược lại với truy vấn tồn tại, truy vấn này tìm kiếm các đối tượng không có trường cụ thể hoặc trường có giá trị null.

  • Wildcard or regexp query - Truy vấn này sử dụng các biểu thức chính quy để tìm các mẫu trong các đối tượng.

Truy vấn kết hợp

Các truy vấn này là một tập hợp các truy vấn khác nhau được hợp nhất với nhau bằng cách sử dụng các toán tử Boolean như và, hoặc không hoặc cho các chỉ số khác nhau hoặc có các lệnh gọi hàm, v.v.

POST /schools/_search
{
   "query": {
      "bool" : {
         "must" : {
            "term" : { "state" : "UP" }
         },
         "filter": {
            "term" : { "fees" : "2200" }
         },
         "minimum_should_match" : 1,
         "boost" : 1.0
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 6,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 0,
         "relation" : "eq"
      },
      "max_score" : null,
      "hits" : [ ]
   }
}

Truy vấn địa lý

Các truy vấn này liên quan đến vị trí địa lý và điểm địa lý. Những truy vấn này giúp tìm ra trường học hoặc bất kỳ đối tượng địa lý nào khác gần bất kỳ vị trí nào. Bạn cần sử dụng kiểu dữ liệu điểm địa lý.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{  "acknowledged" : true,
   "shards_acknowledged" : true,
   "index" : "geo_example"
}

Bây giờ chúng tôi đăng dữ liệu trong chỉ mục được tạo ở trên.

POST /geo_example/_doc?refresh
{
   "name": "Chapter One, London, UK",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

Khi chạy đoạn mã trên, chúng tôi nhận được phản hồi như hình dưới đây:

{
   "took" : 1,
   "timed_out" : false,
   "_shards" : {
      "total" : 1,
      "successful" : 1,
      "skipped" : 0,
      "failed" : 0
   },
   "hits" : {
      "total" : {
         "value" : 2,
         "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
         "_index" : "geo_example",
         "_type" : "_doc",
         "_id" : "hASWZ2oBbkdGzVfiXHKD",
         "_score" : 1.0,
         "_source" : {
            "name" : "Chapter One, London, UK",
            "location" : {
               "type" : "point",
               "coordinates" : [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }