Câu trả lời:
term
truy 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 Bennett
tạ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:
Ví dụ: nếu bạn lập chỉ mục các tài liệu sau (sử dụng trình standard
phân tích cho trường foo
):
{ "foo":"I just said hello world" }
{ "foo":"Hello world" }
{ "foo":"World Hello" }
Đây match_phrase
truy 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_string
tì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_phrase
truy 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_phrase
truy 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.
match
truy 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.
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, wildcard
các truy vấn theo mặc định chỉ hoạt động trên keyword
cá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.