2013-03-18 35 views
10

Tôi đang cố gắng thực hiện một truy vấn đơn giản cho hai trường được chỉ định và hướng dẫn sử dụng và google đang chứng minh là có ít trợ giúp. Ví dụ dưới đây sẽ làm cho nó khá rõ ràng những gì tôi muốn làm.Một truy vấn AND đơn giản với Elasticsearch

{ 
    "query": { 
     "and": { 
     "term": { 
      "name.family_name": "daniel", 
      "name.given_name": "tyrone" 
     } 
     } 
    } 
} 

Là câu hỏi tiền thưởng, tại sao tìm "Daniel Tyrone" với "daniel", nhưng KHÔNG nếu tôi tìm kiếm "Daniel". Nó hoạt động giống như một tìm kiếm nhạy cảm chống lại trường hợp kỳ lạ.

Trả lời

9

Chỉnh sửa: Đã cập nhật, xin lỗi. Bạn cần một đối tượng riêng biệt Term cho từng lĩnh vực, bên trong một truy vấn Bool: Truy vấn

{ 
    "query": { 
    "bool": { 
     "must" : [ 
      { 
      "term": { 
      "name.family_name": "daniel" 
      } 
     }, 
     { 
      "term": { 
      "name.given_name": "tyrone" 
      } 
     } 
     ] 
    } 
    } 
} 

hạn không được phân tích bởi ElasticSearch, mà làm cho họ phân biệt chữ hoa. Truy vấn Thời hạn nói với ES "tìm mã thông báo chính xác này bên trong chỉ mục của bạn, bao gồm cả chữ hoa và dấu chấm câu".

Nếu bạn muốn không phân biệt chữ hoa chữ thường, bạn có thể thêm từ khóa + bộ lọc chữ thường vào máy phân tích của mình. Ngoài ra, bạn có thể sử dụng truy vấn phân tích văn bản của mình tại thời điểm truy vấn (như một truy vấn Match)

Chỉnh sửa2: Bạn cũng có thể sử dụng bộ lọc Bool hoặc And.

+0

Bạn hiểu lầm câu hỏi nhạy cảm trường hợp của tôi, tôi nói nó là hành xử như một tìm kiếm nhạy cảm trường hợp ngược lại, nó không tìm thấy " Daniel "khi tôi tìm kiếm bằng" Daniel " –

+0

Ví dụ truy vấn bạn đã cung cấp, cho tôi lỗi> http://pastium.org/view/c0efa58b6b7689bfff5a9f480c01ed01 –

+0

Rất tiếc, xin lỗi về điều đó. Tôi không bao giờ nên trả lời câu hỏi về SO trước khi uống cà phê. Tôi đã suy nghĩ và bộ lọc, khi trong thực tế ES chỉ có truy vấn Bool. Bạn cũng có thể sử dụng bộ lọc Bool hoặc Và tùy thuộc vào trường hợp sử dụng của bạn. – Zach

2

Tôi tìm thấy một giải pháp cho ít nhất nhiều so sánh văn bản trên cùng một trường:

{ 
    "query": { 
    "match": { 
     "name.given_name": { 
     "query": "daniel tyrone", 
     "operator": "and" 
     } 
    } 
    } 

Và Tôi thấy điều này cho nhiều lĩnh vực, đây là cách chính xác?

{ 
    "query": { 
    "bool": { 
     "must": [   
     { 
      "match": { 
      "name.formatted": { 
       "query": "daniel tyrone", 
       "operator": "and" 
      } 
      } 
     }, 
     { 
      "match": { 
      "display_name": "tyrone" 
      } 
     } 
     ] 
    } 
    } 
} 
+1

Đúng, truy vấn thứ hai của bạn sẽ hoạt động (giả sử bạn muốn 'daniel tyrone' được phân tích bởi các máy phân tích được đặt trên trường tài liệu). – Zach

+0

Nếu bạn không chắc chắn về câu trả lời, bạn không nên đăng câu trả lời, bạn luôn có thể thêm nó làm nhận xét cho câu hỏi ban đầu của bạn – tugcem

+0

Cuối cùng tôi đã tìm thấy câu trả lời này!Toán tử trong truy vấn đầu tiên của bạn làm gì? Tôi có đúng không, rằng nó sẽ cố gắng tìm từ kết hợp cho given_name? Nói cách khác, given_name trông giống như 'daniel tyrone' không chỉ là daniel hay tyrone? –

0

Nếu soạn json bằng PHP, 2 ví dụ này làm việc cho tôi.

$ activeFilters chỉ là một chuỗi dấu phẩy tách ra như: 'hấp dẫn, Limpopo'

$articles = Article::searchByQuery(array(
     'match' => array(
      'cf_categories' => array(
       'query' => $activeFilters, 
       'operator' =>'and' 
      ) 
     ) 
    )); 

    // The below code is also working 100% 
    // Using Query String https://www.elastic.co/guide/en/elasticsearch/reference/1.4/query-dsl-query-filter.html 
    // https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html 
    /* $articles = Article::searchByQuery(array(
     'query_string' => array(
      'query' => 'cf_categories:attractions AND cf_categories:limpopo' 
     ) 
    )); */ 
Các vấn đề liên quan