2014-09-23 20 views
54

Mới đây để tìm kiếm đàn hồi và 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ể biết, các kết hợp term một cụm từ (cần phải viết thường cho kết quả phù hợp để hoạt động?) Và cả hai số match phrasequery string khớp với một chuỗi văn bản.Tìm kiếm đàn hồi: Sự khác biệt giữa "Cụm từ", "Cụm từ đối sánh" và "Chuỗi truy vấn"

Trả lời

121

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

Nếu bạn cung cấp Bennett lúc chỉ số và giá trị không được phân tích, các truy vấn sau đây sẽ không trở lại bất cứ điều gì:

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

match_phrase truy vấn sẽ phân tích đầu vào nếu phân tích được định nghĩa cho lĩnh vực truy vấn và tìm các văn bản 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 lĩnh vực này
  • họ phải có cùng trật tự như giá trị đầu vào

Ví dụ, nếu bạn chỉ mục các loại giấy tờ sau (sử dụng standard phân tích cho trường foo):

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

{ "foo":"Hello world" } 

{ "foo":"World Hello" } 

truy vấn match_phrase này sẽ chỉ trả lại tài liệu đầu tiên và thứ hai:

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

query_string truy vấn tìm kiếm , theo mặc định, trên trường _all chứa văn bản của một số trường văn bản cùng một lúc. Ngày đầu đó, nó được phân tích cú pháp và hỗ trợ một số toán tử (AND/OR ...), ký tự đại diện và vv (xem related syntax).

Là truy vấn match_phrase, đầu vào được phân tích theo bộ phân tích 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 quanh đầu vào.

Ví dụ, bằng cách sử dụng cùng một tài liệu như trước đây, truy vấn này sẽ trả lại tất cả các tài liệu:

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

Nhưng truy vấn này sẽ trở lại với 2 văn bản giống như match_phrase truy vấn:

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

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

Hy vọng điều này là đủ rõ ràng và nó sẽ giúp.

+0

Tuyệt vời, tuyệt vời, và triệt để giải thích! Điều duy nhất tôi chưa rõ là phân tích chính xác là gì hay không ... – blee908

+1

Bạn được chào đón :) Các nhà phân tích xử lý văn bản để thu được các thuật ngữ cuối cùng được lập chỉ mục/tìm kiếm. Đọc những [trang của Hướng dẫn dứt khoát của ElasticSearch] (http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_exact_values_vs_full_text.html) 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à cách tìm kiếm đàn hồi đang thực hiện tìm kiếm của nó. SO MUCH TO TO !!! Cảm ơn vì tài nguyên! – blee908

8

Tôi nghĩ rằng một số một chắc chắn tìm kiếm sự khác biệt giữa chúng liên quan đến TÌM KIẾM MỘT PHẦN Dưới đây là phân tích của tôi với mặc định 'phân tích tiêu chuẩn': -

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

{ "tên": “Xin chào”}

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

Query Term HOẶC trận truy vấn

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

Sẽ không làm việc, trở lại lưu ý.

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

Sẽ không hoạt động, trả lại lưu ý.

Kết luận - Thời hạn hoặc trận đấu là không thể làm được việc tìm kiếm một phần ở tất cả các truy vấn

wildcard: -

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

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

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

Sẽ không hoạt động, trả lại n oting.

Kết luận - wildcard có thể làm tìm kiếm một phần với một chiếc thẻ chỉ

QUERY_STRING: -

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

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

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

Sẽ cho kết quả {"name": "Hello"}.

Kết luận - QUERY_STRING có thể tìm kiếm với hai dấu hiệu được cho

-> đây là dấu hiệu ell và zz

Các vấn đề liên quan