2015-02-09 33 views
6

Tôi đang cố viết truy vấn bằng query_string để truy vấn dữ liệu bằng các đối tượng lồng nhau.Truy vấn Elasticsearch_string truy vấn lồng nhau

Một ví dụ về truy vấn tôi muốn làm là một trong những điều này:

{ 
    "query": { 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

đâu "a" là một đối tượng lồng nhau, và "id" là một lĩnh vực "a".

Tôi biết tôi có thể thành công thực hiện nhiệm vụ này bằng cách sử dụng một truy vấn lồng nhau, viết một truy vấn như:

{ 
    "nested": { 
    "path": "a" 
    "query_string": { 
     "query": "a.id:2" 
    } 
    } 
} 

Tuy nhiên, tôi muốn tránh nó. Tôi không muốn tìm ra một mình rằng người dùng đang tìm kiếm một trường lồng nhau và sửa đổi truy vấn. Tôi đã cố gắng sử dụng tham số "trường", nhưng có vẻ như nó không hoạt động với các đối tượng lồng nhau.

Có thể viết truy vấn này trực tiếp bằng truy vấn "query_string" không? Ngữ nghĩa nào có thể đạt được? (ví dụ: nếu tôi viết "a.id:2 AND ab: 10" Tôi khớp với hai trường trong cùng một đối tượng hoặc trong các đối tượng khác nhau?)

+0

Tôi đang cố gắng tìm câu trả lời cho cùng một câu hỏi này. Chỉ cần tự hỏi nếu bạn đã có thể tìm thấy bất kỳ giải pháp nào được nêu ra. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời! Cảm ơn – Vineet

+0

Rất tiếc, tôi không tìm thấy giải pháp. – Cale

Trả lời

7

Tôi đã nghiên cứu thêm và nhận thấy điều này có thể đạt được bằng cách đặt thiết lập include_in_parent thành true trong ánh xạ.

Bây giờ bạn sẽ có thể để làm một truy vấn như

{ 
    "query": { 
    "query_string": { 
     "query": "fields.fieldvalue:sometext" 
    } 
    } 
} 

Ví dụ: -

"mappings": { 
     "documentmetadatavalue": { 
      "properties": { 
       "id": { 
        "type": "string" 
       }, 
       "fields": { 
       "type": "nested", 
       "include_in_parent": true, 
       "properties": { 
        "fieldId": {"type": "string"}, 
        "fieldvalue": {"type": "string"} 
       } 
       } 
      } 
     } 
    } 

Hãy cho tôi biết nếu điều đó giúp.

+4

Những gì bạn đề xuất là một lựa chọn tốt. Tuy nhiên, lưu ý rằng với cài đặt "include_in_parent", bạn sẽ làm phẳng tài nguyên lồng nhau như một đối tượng trong phần tử cha. Bạn đang thực sự reindexing tài liệu như là một đối tượng phẳng. Bạn đang mất một số tính năng đẹp của các đối tượng lồng nhau. Ví dụ, nếu bạn tìm kiếm các đối tượng cha mẹ có ít nhất MỘT con với HAI thuộc tính với một giá trị cụ thể, truy vấn sẽ không kiểm tra xem các thuộc tính TWO có các giá trị đó trong một con duy nhất hay không. – Cale

+0

Xem tài liệu về inner_hits vừa được phát hành gần đây. Bạn sẽ có thể làm cho nó hoạt động với tính năng mới này. (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-inner-hits.html#nested-inner-hits – Vineet

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