Elasticsearch: Sự khác biệt giữa "Thuật ngữ", "Cụm từ đối sánh" và "Chuỗi truy vấn"


116

Mới ở đây với Elasticsearch và đang cố gắng hiểu rõ hơn về sự khác biệt giữa các truy vấn này. Theo như tôi có thể nói, termđối sánh với một cụm từ duy nhất (cần phải là chữ thường để đối sánh hoạt động?) Và cả hai match phrasequery string khớp với một chuỗi văn bản.

Câu trả lời:


226

termtruy vấn khớp với một thuật ngữ duy nhất vì nó là: giá trị không được phân tích . Vì vậy, nó không nhất thiết phải viết thường tùy thuộc vào những gì bạn đã lập chỉ mục.

Nếu bạn đã cung cấp Bennetttại thời điểm lập chỉ mục và giá trị không được phân tích, truy vấn sau sẽ không trả về bất kỳ thứ gì:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase truy vấn sẽ phân tích đầu vào nếu các bộ phân tích được xác định cho trường được truy vấn và tìm thấy các tài liệu phù hợp với các tiêu chí sau:

  • tất cả các điều khoản phải xuất hiện trong trường
  • chúng phải có cùng thứ tự với giá trị đầu vào

Ví dụ: nếu bạn lập chỉ mục các tài liệu sau (sử dụng trình standardphân tích cho trường foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Đây match_phrasetruy vấn sẽ chỉ trả lại các tài liệu đầu tiên và thứ hai:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringtìm kiếm truy vấn, theo mặc định, trên một trường _ tất cả chứa văn bản của một số trường văn bản cùng một lúc. Trên hết, nó được phân tích cú pháp và hỗ trợ một số toán tử (VÀ / HOẶC ...), ký tự đại diện, v.v. (xem cú pháp liên quan ).

Khi các match_phrasetruy vấn, đầu vào được phân tích theo bộ phân tích được đặt trên trường được truy vấn.

Không giống như match_phrase, các thuật ngữ thu được sau khi phân tích không nhất thiết phải theo cùng một thứ tự, trừ khi người dùng đã sử dụng dấu ngoặc kép xung quanh đầu vào.

Ví dụ: sử dụng các tài liệu giống như trước đây, truy vấn này sẽ trả về tất cả các tài liệu:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Nhưng truy vấn này sẽ trả về 2 tài liệu giống như match_phrasetruy vấn:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Còn nhiều điều để nói về các tùy chọn khác nhau cho những truy vấn đó, vui lòng xem tài liệu liên quan:

Hy vọng điều này đủ rõ ràng và nó sẽ hữu ích.


Giải thích tuyệt vời, tuyệt vời và thấu đáo! Điều duy nhất tôi không rõ ràng trên là những gì chính xác một phân tích hay không ...
blee908

1
Bạn được chào đón :) Các nhà phân tích xử lý văn bản để có được các thuật ngữ cuối cùng được lập chỉ mục / tìm kiếm. Đọc các trang này của Hướng dẫn Định nghĩa về ElasticSearch vì đây là một khái niệm thực sự quan trọng cần hiểu.
ThomasC

1
Vâng đến từ SQL, có rất nhiều ý tưởng mới ở đây. Sự khác biệt giữa truy vấn và bộ lọc, giá trị chính xác so với văn bản đầy đủ, đối tượng tìm kiếm JSON và chỉ cách tìm kiếm đàn hồi đang thực hiện tìm kiếm. RẤT NHIỀU ĐỂ THAM GIA !!! Cảm ơn nguồn tài nguyên!
blee908

1
@ThomasC Nếu bạn có {"foo": "Hello beautiful world"} trong chỉ mục của mình, thì truy vấn đối sánh có trả về giá trị này không?
batmaci

1
@batmaci một matchtruy vấn sử dụng trình phân tích nếu trường được phân tích, vì vậy có. Theo mặc định, nó sẽ trả về các tài liệu có ít nhất một trong các điều khoản (xem tham số operator) và thứ tự không quan trọng.
ThomasC

17

Tôi nghĩ một số người chắc chắn đang tìm kiếm sự khác biệt giữa chúng đối với TÌM KIẾM BÊN TRONG Đây là phân tích của tôi với 'máy phân tích tiêu chuẩn' mặc định : -

Giả sử, Chúng tôi có dữ liệu: -

{"name": “Xin chào”}

Bây giờ nếu chúng ta muốn thực hiện tìm kiếm từng phần với ell thì sao ???

Truy vấn thuật ngữ HOẶC truy vấn đối sánh

{"term":{"name": "*ell*" }

Sẽ không hoạt động, trả lại ghi chú.

{"term":{"name": "*zz* *ell*" }

Sẽ không hoạt động, trả lại ghi chú.

Phần kết luận - Cụm từ hoặc Đối sánh hoàn toàn không thể thực hiện tìm kiếm từng phần

Truy vấn ký tự đại diện: -

{"wildcard":{"name": "*ell*" }

Sẽ làm việc cho kết quả {"name": "Xin chào"}

{"wildcard":{"name": "*zz* *ell*" }

Sẽ không hoạt động, trả lại ghi chú.

Kết luận - ký tự đại diện có thể thực hiện tìm kiếm một phần chỉ với một mã thông báo

Chuỗi truy vấn :-

{"query_string": {"default_field": "name","query": "*ell*"}

Sẽ làm việc cho kết quả {"name": “Xin chào”}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Sẽ làm việc cho kết quả {"name": “Xin chào”}.

Phần kết luận - query_string có thể tìm kiếm với hai mã thông báo được đưa ra

-> mã thông báo ở đây là ell và zz


wildcard is able to do partial search with one token only: chính xác hơn, wildcardcác truy vấn theo mặc định chỉ hoạt động trên keywordcác trường , theo định nghĩa là mã thông báo đơn. Điều đó không liên quan gì đến nội dung trường có nhiều hơn một từ. Trong truy vấn ký tự đại diện của bạn, "ozzy hello" sẽ phù hợp.
sox với Monica
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.