2014-10-08 29 views
16

Tôi đang cố gắng tìm hiểu elasticsearch bằng một ứng dụng mẫu đơn giản, liệt kê các trích dẫn được liên kết với mọi người. Lập bản đồ ví dụ có thể trông giống như:Tìm kiếm chuỗi truy tìm trên các phần tử mảng trong Tìm kiếm Đàn hồi

{ 
    "people" : { 
    "properties" : { 
     "name" : { "type" : "string"}, 
     "quotations" : { "type" : "string" } 
    } 
    } 
} 

Một số dữ liệu ví dụ có thể trông giống như:

{ "name" : "Mr A", 
    "quotations" : [ "quotation one, this and that and these" 
       , "quotation two, those and that"] 
} 

{ "name" : "Mr B", 
    "quotations" : [ "quotation three, this and that" 
       , "quotation four, those and these"] 
} 

Tôi muốn để có thể sử dụng api chuỗi truy vấn trên trích dẫn cá nhân, và trả lại những người phù hợp. Ví dụ, tôi có thể muốn tìm những người có một báo giá có chứa (này và những) - mà nên trả lại "ông A" nhưng không phải "ông B", và như vậy. Làm thế nào tôi có thể đạt được điều này?

EDIT1: Câu trả lời

Andrei của dưới đây dường như làm việc, với các giá trị dữ liệu bây giờ nhìn như:

{"name":"Mr A","quotations":[{"value" : "quotation one, this and that and these"}, {"value" : "quotation two, those and that"}]} 

Tuy nhiên, tôi dường như không thể có được một truy vấn QUERY_STRING để làm việc. Sau đây không tạo ra kết quả nào:

{ 
    "query": { 
    "nested": { 
     "path": "quotations", 
     "query": { 
     "query_string": { 
      "default_field": "quotations", 
      "query": "quotations.value:this AND these" 
     } 
     } 
    } 
    } 
} 

Có cách nào để truy vấn query_string hoạt động với đối tượng lồng nhau không?

Chỉnh sửa2: Vâng, xem câu trả lời của Andrei.

Trả lời

22

Đối với yêu cầu đó phải đạt được, bạn cần phải nhìn vào đối tượng lồng nhau, không truy vấn danh sách giá trị được làm phẳng nhưng giá trị riêng lẻ từ đối tượng lồng nhau đó.Ví dụ:

{ 
    "mappings": { 
    "people": { 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "quotations": { 
      "type": "nested", 
      "properties": { 
      "value": { 
       "type": "string" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Values:

{"name":"Mr A","quotations":[{"value": "quotation one, this and that and these"}, {"value": "quotation two, those and that"}]} 
{"name":"Mr B","quotations":[{"value": "quotation three, this and that"}, {"value": "quotation four, those and these"}]} 

Query:

{ 
    "query": { 
    "nested": { 
     "path": "quotations", 
     "query": { 
     "bool": { 
      "must": [ 
      { "match": {"quotations.value": "this"}}, 
      { "match": {"quotations.value": "these"}} 
      ] 
     } 
     } 
    } 
    } 
} 
+0

Tôi phải thay đổi các giá trị như sau: '{" name ":" Mr A "," quotations ": [{" value ":" ngoặc kép, giá trị này và giá trị "}, {" ": "báo giá hai, những cái đó và"}]} ", nhưng điều này đã làm việc. Có cách nào để sử dụng QueryStringQuery với điều này không? Tôi đã thử bằng cách sử dụng một (chỉ cần thay thế bool với query_string), và nó không có vẻ làm việc. – oneway

+0

Bạn nói đúng. Bây giờ tôi nhận thấy rằng tôi đã sao chép các giá trị sai, mặc dù tôi đã thử nghiệm với các giá trị đúng (những cái bạn đã đề cập). –

+0

Hãy thử điều này: '{ "truy vấn": { "lồng": { "con đường": "trích dẫn", "truy vấn": { "QUERY_STRING": { "default_field": "quotations.value", "truy vấn": "điều này VÀ" } } } } } ' –

5

Thật không may là không có cách nào tốt để làm điều đó. http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/complex-core-fields.html

Khi bạn nhận được một tài liệu trở lại từ Elasticsearch, bất kỳ mảng sẽ được ở thứ tự như khi bạn lập chỉ mục tài liệu. Trường _source mà bạn lấy lại chứa chính xác cùng một tài liệu JSON mà bạn đã lập chỉ mục .

Tuy nhiên, các mảng được lập chỉ mục - có thể tìm kiếm được - dưới dạng nhiều trường giá trị, không có thứ tự. Tại thời điểm tìm kiếm, bạn không thể tham chiếu đến “phần tử đầu tiên” hoặc “phần tử cuối cùng”. Thay vì nghĩ về một mảng như một túi giá trị .

Nói cách khác, nó luôn xem xét tất cả các giá trị trong mảng.

này sẽ trở lại chỉ ông A

{ 
    "query": { 
    "match": { 
     "quotations": { 
     "query": "quotation one", 
     "operator": "AND" 
     } 
    } 
    } 
} 

Nhưng điều này sẽ trả lại cả hai ông A & ông B:

{ 
    "query": { 
    "match": { 
     "quotations": { 
     "query": "this these", 
     "operator": "AND" 
     } 
    } 
    } 
} 
+0

sử dụng nhà điều hành của bạn và vv .. i quản lý. thnks –

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