Ví dụ mờ chuỗi truy vấn Elaticsearch

Bắt truy vấn Elaticsearch đúng với cú pháp của nó có thể khó khăn và gây nhầm lẫn, mặc dù tìm kiếm là chức năng chính của Elatic…ừm…tìm kiếm. Để trợ giúp, hướng dẫn này sẽ đưa bạn qua các truy vấn tìm kiếm phổ biến cho Elaticsearch và giúp bạn đạt được thành công trong truy vấn trong tương lai

Cú pháp truy vấn Lucene

Elaticsearch là một phần của ELK Stack và được xây dựng trên Lucene, thư viện tìm kiếm từ Apache và hiển thị cú pháp truy vấn của Lucene. Nó là một phần không thể thiếu của Elaticsearch khi bạn truy vấn gốc của cụm Elaticsearch, nó sẽ cho bạn biết phiên bản Lucene

{
  "name": "node-1",
  "cluster_name": "my-cluster",
  "cluster_uuid": "WqJjKjo9QrOkz939eqHrDA",
  "version": {
    "number": "7.10.2",
    "build_flavor": "oss",
    "build_type": "docker",
    "build_hash": "747e1cc71def077253878a59143c1f785afa92b9",
    "build_date": "2021-01-13T00:42:12.435326Z",
    "build_snapshot": false,
    "lucene_version": "8.7.0",
    "minimum_wire_compatibility_version": "6.8.0",
    "minimum_index_compatibility_version": "6.0.0-beta1"
  },
  "tagline": "You Know, for Search"
}

Biết cú pháp Lucene và các toán tử sẽ giúp ích rất nhiều trong việc giúp bạn xây dựng các truy vấn. Công dụng của nó là trong cả truy vấn chuỗi truy vấn đơn giản và tiêu chuẩn. Dưới đây là một số điều cơ bản

Truy vấn DSL

Truy vấn DSL có thể được gọi bằng hầu hết các API tìm kiếm của Elaticsearch. Để đơn giản, chúng tôi sẽ chỉ xem API tìm kiếm sử dụng điểm cuối _search. Khi gọi API tìm kiếm, bạn có thể chỉ định chỉ mục và/hoặc loại mà bạn muốn tìm kiếm. Bạn thậm chí có thể tìm kiếm trên nhiều chỉ mục bằng cách tách tên của chúng bằng dấu phẩy hoặc sử dụng ký tự đại diện để khớp với nhiều chỉ mục

Tìm kiếm trên tất cả các chỉ số Logstash

curl localhost:9200/logstash-*/_search

Tìm kiếm trong các chỉ số khách hàng, trong các loại

curl localhost:9200/logstash-*/_search
5 và
curl localhost:9200/logstash-*/_search
6

curl localhost:9200/clients/bigcorp,smallco/_search

Chúng tôi sẽ sử dụng Tìm kiếm cơ thể theo yêu cầu, vì vậy các tìm kiếm sẽ được gọi như sau

curl localhost:9200/_search -H "Content-Type: application/json" -d '{"query":{"match": {"my_field":"meaning"}}}'

Tìm kiếm URI

Cách dễ nhất để tìm kiếm cụm Elaticsearch của bạn là thông qua tìm kiếm URI. Bạn có thể chuyển một truy vấn đơn giản tới Elaticsearch bằng tham số truy vấn q. Truy vấn sau đây sẽ tìm kiếm toàn bộ cụm của bạn để tìm các tài liệu có trường tên bằng “travis”

curl “localhost:9200/_search?q=name:travis”

Với cú pháp Lucene, bạn có thể xây dựng các tìm kiếm khá ấn tượng. Thông thường, bạn sẽ phải mã hóa URL các ký tự như khoảng trắng [chúng tôi đã bỏ qua nó trong các ví dụ này cho rõ ràng]

curl “localhost:9200/_search?q=name:john~1 AND [age:[30 TO 40} OR surname:K*] AND -city”

Có sẵn một số tùy chọn cho phép bạn tùy chỉnh tìm kiếm URI, cụ thể là về việc sử dụng bộ phân tích nào [máy phân tích], liệu truy vấn có phải chịu lỗi [dễ dãi] hay không và liệu có nên cung cấp giải thích về điểm số hay không [

Mặc dù tìm kiếm URI là một cách đơn giản và hiệu quả để truy vấn cụm của bạn, nhưng bạn sẽ nhanh chóng thấy rằng nó không hỗ trợ tất cả các tính năng mà ES cung cấp. Toàn bộ sức mạnh của Elaticsearch được thể hiện rõ ràng thông qua Request Body Search. Sử dụng Request Body Search cho phép bạn xây dựng một yêu cầu tìm kiếm phức tạp bằng cách sử dụng các phần tử và mệnh đề truy vấn khác nhau sẽ so khớp, lọc và sắp xếp cũng như thao tác tài liệu tùy thuộc vào nhiều tiêu chí

Yêu cầu tìm kiếm cơ thể

Yêu cầu Tìm kiếm nội dung sử dụng tài liệu JSON chứa nhiều thành phần khác nhau để tạo tìm kiếm trên cụm Elaticsearch của bạn. Bạn không chỉ có thể chỉ định tiêu chí tìm kiếm mà còn có thể chỉ định phạm vi và số lượng tài liệu mà bạn mong đợi, các trường bạn muốn và nhiều tùy chọn khác

Phần tử đầu tiên của tìm kiếm là phần tử truy vấn sử dụng DSL truy vấn. Việc sử dụng DSL truy vấn đôi khi có thể gây nhầm lẫn vì DSL có thể được sử dụng để kết hợp và xây dựng các mệnh đề truy vấn thành một truy vấn có thể được lồng sâu. Vì hầu hết các tài liệu của Elaticsearch chỉ đề cập đến các mệnh đề riêng biệt, nên rất dễ bị mất vị trí đặt các mệnh đề

Để sử dụng DSL truy vấn, bạn cần bao gồm phần tử "truy vấn" trong nội dung tìm kiếm của mình và điền vào đó một truy vấn được tạo bằng DSL

________số 8

Trong trường hợp này, phần tử “truy vấn” chứa mệnh đề truy vấn “khớp” tìm kiếm cụm từ “nghĩa” trong trường “my_field” trong tất cả các tài liệu trong cụm của bạn

Phần tử truy vấn được sử dụng cùng với các phần tử khác trong nội dung tìm kiếm

{
  "query": {
    "match": {
      "my_field": "meaning"
    }
  },
  "fields": [
    "name",
    "surname",
    "age"
  ],
  "from": 100,
  "size": 20
}

Ở đây, chúng tôi đang sử dụng phần tử “trường” để hạn chế trường nào sẽ được trả về và phần tử “từ” và “kích thước” để cho Elaticsearch biết rằng chúng tôi đang tìm kiếm tài liệu từ 100 đến 119 [bắt đầu từ 100 và đếm 20 tài liệu]

Lĩnh vực

Bạn có thể đang tìm kiếm các sự kiện trong đó một trường cụ thể chứa các thuật ngữ nhất định. Bạn chỉ định trường, nhập dấu hai chấm, sau đó là khoảng trắng, sau đó là chuỗi trong dấu ngoặc kép hoặc giá trị không có dấu ngoặc kép. Dưới đây là một số ví dụ trường Lucene

  • Tên. “Ned Stark”
  • trạng thái. 404

Hãy cẩn thận với các giá trị có dấu cách, chẳng hạn như “Ned Stark. ” Bạn sẽ cần đặt nó trong dấu ngoặc kép để đảm bảo rằng toàn bộ giá trị được sử dụng

Bộ lọc so với. Truy vấn

Những người đã sử dụng Elaticsearch trước phiên bản 2 sẽ quen thuộc với các bộ lọc và truy vấn. Bạn đã từng xây dựng nội dung truy vấn bằng cả bộ lọc và truy vấn. Sự khác biệt giữa hai loại này là các bộ lọc thường nhanh hơn vì chúng chỉ kiểm tra xem một tài liệu có khớp hoàn toàn hay không chứ không phải liệu nó có khớp hay không. Nói cách khác, các bộ lọc đưa ra câu trả lời boolean trong khi truy vấn trả về điểm số được tính toán về mức độ phù hợp của tài liệu với truy vấn

chấm điểm

Chúng tôi đã đề cập đến thực tế là Elaticsearch trả về điểm số cùng với tất cả các tài liệu phù hợp từ một truy vấn

curl localhost:9200/logstash-*/_search
0

Điểm này được tính dựa trên các tài liệu trong Elaticsearch dựa trên các truy vấn được cung cấp. Các yếu tố như độ dài của trường, tần suất xuất hiện của thuật ngữ đã chỉ định trong trường và [trong trường hợp tìm kiếm ký tự đại diện và tìm kiếm mờ] mức độ khớp của thuật ngữ với giá trị đã chỉ định, tất cả đều ảnh hưởng đến điểm số. Điểm tính toán sau đó được sử dụng để sắp xếp các tài liệu, thường là từ điểm cao nhất đến thấp nhất và các tài liệu có điểm cao nhất sau đó sẽ được trả lại cho khách hàng. Có nhiều cách khác nhau để tác động đến điểm số của các truy vấn khác nhau, chẳng hạn như tham số tăng. Điều này đặc biệt hữu ích nếu bạn muốn một số truy vấn nhất định trong một truy vấn phức tạp có trọng lượng lớn hơn các truy vấn khác và bạn đang tìm kiếm các tài liệu quan trọng nhất

Khi sử dụng truy vấn trong ngữ cảnh bộ lọc [như đã giải thích trước đó], không có điểm nào được tính. Điều này cung cấp hiệu suất nâng cao thường được kết hợp với việc sử dụng các bộ lọc nhưng không cung cấp các tính năng quan trọng và thứ tự đi kèm với tính điểm

Truy vấn Cấp kỳ hạn

1. Phạm vi truy vấn

Bạn có thể tìm kiếm các trường trong một phạm vi cụ thể, sử dụng dấu ngoặc vuông để tìm kiếm phạm vi bao gồm và dấu ngoặc nhọn để tìm kiếm phạm vi riêng

  • tuổi tác. [3 TO 10] — Sẽ trả lại các sự kiện có độ tuổi từ 3 đến 10
  • giá bán. {100 TO 400} — Sẽ trả về các sự kiện có giá từ 101 đến 399
  • Tên. [Adam TO Ziggy] — Sẽ trả về các tên giữa và bao gồm cả Adam và Ziggy

Như bạn có thể thấy trong các ví dụ trên, bạn cũng có thể sử dụng phạm vi trong các trường không phải là số như chuỗi và ngày tháng

2. Truy vấn ký tự đại diện

Tìm kiếm sẽ không phải là tìm kiếm nếu không có ký tự đại diện. Bạn có thể sử dụng ký tự * cho nhiều ký tự đại diện hoặc ?

  • Maśs — Sẽ khớp với Mars, Mass và Maps
  • Ma*s — Sẽ khớp với Mars, Matches và Massachusetts

3. Truy vấn Regex [regex]

Truy vấn Regex [

curl localhost:9200/logstash-*/_search
7] cung cấp cho bạn nhiều quyền lực hơn. Chỉ cần đặt regex của bạn giữa các dấu gạch chéo về phía trước [/]

  • /p[ea]n/ — Sẽ khớp với cả pen và pan
  • // — Will match text that resembles an HTML tag

4. truy vấn mờ

Tìm kiếm mờ sử dụng Khoảng cách Damerau-Levenshtein để đối sánh các thuật ngữ giống nhau về chính tả. Điều này thật tuyệt khi tập dữ liệu của bạn có từ sai chính tả

Sử dụng dấu ngã [~] để tìm các từ tương tự

  • thổi ~

Điều này sẽ trả về các kết quả như “thổi,” “brow,” và “glow. ”

Sử dụng dấu ngã [~] cùng với một số để chỉ định khoảng cách giữa các từ có thể là bao nhiêu

  • john~2

Điều này sẽ phù hợp, trong số những thứ khác. “jean,” “johns,” “jhon,” và “horn”

5. Văn bản miễn phí

Nó đơn giản như nó nghe. Chỉ cần nhập thuật ngữ hoặc giá trị bạn muốn tìm. Đây có thể là một trường, một chuỗi trong một trường, v.v.

6. Truy vấn thuật ngữ Elaticsearch

Cũng chỉ được gọi là truy vấn thuật ngữ, điều này sẽ trả về kết quả khớp chính xác cho một thuật ngữ nhất định. Lấy ví dụ này từ cơ sở dữ liệu thống kê bóng chày

curl localhost:9200/logstash-*/_search
2

Đảm bảo rằng bạn đang sử dụng truy vấn thuật ngữ ở đây, KHÔNG phải truy vấn văn bản. Truy vấn thuật ngữ sẽ tìm kiếm kết quả khớp chính xác;

7. Điều khoản Elaticsearch Đặt truy vấn

Tương tự như truy vấn thuật ngữ, truy vấn term_set có thể tìm kiếm nhiều giá trị dựa trên các điều kiện nhất định được xác định trong yêu cầu PUT. Để tiếp tục ví dụ bóng chày

curl localhost:9200/logstash-*/_search
0

Truy vấn tổng hợp

Toán tử Boolean và Truy vấn Bool

Như với hầu hết các ngôn ngữ máy tính, Elaticsearch hỗ trợ các toán tử AND, OR và NOT

  • jack AND jill — Sẽ trả về các sự kiện chứa cả jack và jill
  • ahab KHÔNG moby — Sẽ trả về các sự kiện có chứa ahab nhưng không chứa moby
  • tom OR jerry — Sẽ trả về các sự kiện có chứa tom hoặc jerry hoặc cả hai

Mặc dù có nhiều loại mệnh đề truy vấn, nhưng loại mà bạn sẽ sử dụng nhiều nhất là Truy vấn phức hợp vì nó được dùng để kết hợp nhiều mệnh đề nhằm xây dựng các truy vấn phức tạp

Truy vấn Bool có lẽ được sử dụng nhiều nhất vì nó có thể kết hợp các tính năng của một số mệnh đề truy vấn ghép khác như mệnh đề And, Or, Filter và Not. Nó được sử dụng nhiều đến mức bốn mệnh đề này không được dùng trong các phiên bản khác nhau để chuyển sang sử dụng truy vấn Bool. Sử dụng nó được giải thích tốt nhất với một ví dụ

curl localhost:9200/logstash-*/_search
1

Trong phần tử truy vấn, chúng tôi đã thêm mệnh đề bool cho biết đây sẽ là một truy vấn boolean. Có khá nhiều thứ đang diễn ra trong đó, vì vậy hãy trình bày từng điều khoản một, bắt đầu từ đầu

phải

Tất cả các truy vấn trong mệnh đề này phải khớp với một tài liệu để ES trả lại tài liệu đó. Hãy coi đây là truy vấn AND của bạn. Truy vấn mà chúng tôi sử dụng ở đây là truy vấn mờ và nó sẽ khớp với bất kỳ tài liệu nào có trường tên khớp với “

curl localhost:9200/logstash-*/_search
8” theo cách mờ. Tham số “độ mờ” bổ sung cho Elaticsearch biết rằng nó nên sử dụng Damerau-Levenshtein Khoảng cách 2 hai xác định độ mờ

không được

Bất kỳ tài liệu nào khớp với truy vấn trong mệnh đề này sẽ nằm ngoài tập kết quả. Đây là toán tử NOT hoặc dấu trừ [-] của truy vấn DSL. Trong trường hợp này, chúng tôi thực hiện một truy vấn khớp đơn giản, tìm kiếm các tài liệu có chứa thuật ngữ “thành phố. ” Đây là điều khoản

curl localhost:9200/logstash-*/_search
9, vì vậy các tài liệu phù hợp sẽ bị loại trừ

Nên

Cho đến bây giờ, chúng tôi đã làm việc với những điều tuyệt đối.

curl localhost:9200/clients/bigcorp,smallco/_search
0 và
curl localhost:9200/logstash-*/_search
9. Nên không tuyệt đối và tương đương với toán tử OR. Elaticsearch sẽ trả về bất kỳ tài liệu nào khớp với một hoặc nhiều truy vấn trong mệnh đề nên

Truy vấn đầu tiên mà chúng tôi cung cấp sẽ tìm kiếm các tài liệu có trường tuổi nằm trong khoảng từ 30 đến 40. Truy vấn thứ hai thực hiện tìm kiếm ký tự đại diện trên trường họ, tìm kiếm các giá trị bắt đầu bằng “K. ”

Truy vấn chứa ba mệnh đề khác nhau, vì vậy Elaticsearch sẽ chỉ trả về các tài liệu phù hợp với tiêu chí trong tất cả chúng. Các truy vấn này có thể được lồng vào nhau, vì vậy bạn có thể xây dựng các truy vấn rất phức tạp bằng cách chỉ định truy vấn bool dưới dạng truy vấn

curl localhost:9200/clients/bigcorp,smallco/_search
0,
curl localhost:9200/logstash-*/_search
9,
curl localhost:9200/clients/bigcorp,smallco/_search
4 hoặc
curl localhost:9200/clients/bigcorp,smallco/_search
5

lọc

Một loại mệnh đề mà chúng ta chưa thảo luận cho truy vấn ghép là mệnh đề

curl localhost:9200/clients/bigcorp,smallco/_search
5. Đây là một ví dụ nơi chúng tôi sử dụng một

curl localhost:9200/logstash-*/_search
2

Truy vấn

curl localhost:9200/clients/bigcorp,smallco/_search
7 trong mệnh đề must cho Elaticsearch biết rằng nó sẽ trả về tất cả các tài liệu. Đây có vẻ không phải là một tìm kiếm hữu ích cho lắm, nhưng nó rất hữu ích khi bạn sử dụng nó cùng với một bộ lọc như chúng tôi đã thực hiện ở đây. Bộ lọc mà chúng tôi đã chỉ định là truy vấn thuật ngữ, yêu cầu tất cả các tài liệu chứa trường email có giá trị “joe@bloggs. com. ”

Chúng tôi đã sử dụng bộ lọc để chỉ định tài liệu nào chúng tôi muốn, vì vậy tất cả chúng sẽ được trả về với số điểm là 1. Các bộ lọc không ảnh hưởng đến việc tính điểm, vì vậy truy vấn match_all cho tất cả các tài liệu điểm 1

Thêm về chủ đề

  • Tích hợp mới từ Logz. io. tháng 11 năm 2021
  • Giám sát Microsoft Azure với Logz. io
  • Chuyển đổi từ ngăn xếp ELK sang Logz. io trong 5 bước nhanh chóng

Một điều cần lưu ý là truy vấn này sẽ không hoạt động nếu trường email được phân tích, đây là giá trị mặc định cho các trường trong trường Elaticsearch. Lý do được thảo luận tốt nhất trong một bài đăng trên blog khác, nhưng thực tế là Elaticsearch phân tích cả trường và truy vấn khi chúng xuất hiện. Trong trường hợp này, trường email sẽ chia thành ba phần. joe, blog và com. Điều này có nghĩa là nó sẽ khớp với các tìm kiếm và tài liệu cho bất kỳ ba cụm từ nào trong số đó

Tăng truy vấn

Có ba loại truy vấn tăng cường trong Elaticsearch.

curl localhost:9200/clients/bigcorp,smallco/_search
8,
curl localhost:9200/clients/bigcorp,smallco/_search
9 và
curl localhost:9200/_search -H "Content-Type: application/json" -d '{"query":{"match": {"my_field":"meaning"}}}'
0. Các truy vấn tích cực thực sự là các truy vấn chính mà bạn muốn tích lũy điểm số liên quan.  

negative_boost là một giá trị từ 0 đến 1, dựa vào đó bạn sẽ nhân các kết quả truy vấn phủ định [nếu bạn đặt

curl localhost:9200/_search -H "Content-Type: application/json" -d '{"query":{"match": {"my_field":"meaning"}}}'
0 ở. 25, nó làm giảm giá trị của truy vấn phủ định xuống còn một phần tư của truy vấn khẳng định;. 5 đến một nửa giá trị dương;. 1 phần mười giá trị của một truy vấn tích cực, v.v. Điều này mang lại cho bạn rất nhiều sự linh hoạt trong việc phân loại các truy vấn của bạn

Truy vấn điểm cố định

Đây là một công cụ có giá trị để phân đoạn các truy vấn nhất định mà bạn muốn tăng điểm số. Gói mã

curl localhost:9200/_search -H "Content-Type: application/json" -d '{"query":{"match": {"my_field":"meaning"}}}'
2 cô lập các cụm từ tìm kiếm nhất định và ghép chúng với một giá trị tăng riêng biệt

curl localhost:9200/logstash-*/_search
3

Vì vậy, trong trường hợp này, bạn đang cung cấp cho bất kỳ nhật ký NGINX nào giá trị lớn hơn các nhật ký khác [có lẽ là hơn các nhật ký máy chủ khác như nhật ký apache2 hoặc nhật ký IIS]

Disjunction Max truy vấn

Hãy tưởng tượng nếu kết quả Google của bạn có thể tách biệt giữa các kết quả bao gồm nhiều thứ bạn đang tìm kiếm và chỉ một vài thứ. Đó là những gì nó làm.  

Bạn có thể nhóm các truy vấn lại với nhau dưới dạng các trường lồng nhau trong tham số

curl localhost:9200/_search -H "Content-Type: application/json" -d '{"query":{"match": {"my_field":"meaning"}}}'
3

curl localhost:9200/logstash-*/_search
4

truy vấn function_score

Truy vấn điểm của hàm, như tên gọi của chúng, tồn tại để giúp sử dụng hàm để tính điểm dễ dàng hơn. Xác định truy vấn và đặt quy tắc về cách tăng điểm kết quả

Sự kết luận

Điều khó nhất về Elaticsearch là độ sâu và bề rộng của các tính năng có sẵn. Chúng tôi đã cố gắng trình bày các yếu tố thiết yếu càng chi tiết càng tốt mà không làm bạn chìm đắm trong thông tin. Đặt bất kỳ câu hỏi nào bạn có thể có trong các nhận xét và tìm kiếm các bài đăng chuyên sâu hơn bao gồm một số tính năng chúng tôi đã đề cập. Bạn cũng có thể đọc hướng dẫn Elaticsearch trước đây của tôi để tìm hiểu thêm

Truy vấn mờ trong Elaticsearch là gì?

Sửa đổi truy vấn mờ. Trả về tài liệu chứa các cụm từ tương tự với cụm từ tìm kiếm, được đo bằng khoảng cách chỉnh sửa Levenshtein . Khoảng cách chỉnh sửa là số lần thay đổi một ký tự cần thiết để biến một thuật ngữ này thành một thuật ngữ khác.

Ví dụ tìm kiếm mờ là gì?

Tìm kiếm mờ giúp bạn tìm thấy kết quả có liên quan ngay cả khi cụm từ tìm kiếm bị sai chính tả. Để thực hiện tìm kiếm mờ, hãy thêm dấu ngã [~] vào cuối cụm từ tìm kiếm. Ví dụ: cụm từ tìm kiếm ngân hàng~ sẽ trả về các hàng có chứa thùng , benk hoặc ngân hàng .

Làm cách nào để truy vấn dữ liệu trong Elaticsearch?

Bạn có thể sử dụng API tìm kiếm để tìm kiếm và tổng hợp dữ liệu được lưu trữ trong các luồng dữ liệu hoặc chỉ mục của Elaticsearch . Tham số nội dung yêu cầu truy vấn của API chấp nhận các truy vấn được viết trong Truy vấn DSL. Yêu cầu sau tìm kiếm my-index-000001 bằng truy vấn khớp. Truy vấn này đối sánh tài liệu với người dùng. giá trị id của kimchi.

Elaticsearch sử dụng ngôn ngữ truy vấn nào?

Elasticsearch cung cấp DSL truy vấn đầy đủ [Ngôn ngữ dành riêng cho miền] dựa trên JSON để xác định truy vấn.

Chủ Đề