2016-03-30 13 views
5

Tôi đang cố gắng sử dụng các trường tập lệnh trong truy vấn của mình. Tôi đã bật kịch bản hộp cát và cố gắng sử dụng biểu thức để tính toán trường mới.Trường tập lệnh sử dụng biểu thức - Chỉ biến thành viên [giá trị] hoặc phương pháp thành viên có thể được truy cập

Vấn đề là tôi nhận được lỗi sau:

{ 
    "type": "expression_script_compilation_exception", 
    "reason": "Only the member variable [value] or member methods may be accessed on a field when not accessing the field directly" 
} 

Dường như chỉ "giá trị" có thể truy cập. tôi đang thiếu gì ở đây?

Khi chạy truy vấn sau đây:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "script_fields" : { 
    "field1" : { 
     "script" : { 
      "lang": "expression", 
      "inline": "doc['about.hobbies'].empty" 
     } 
    } 
    } 
} 

Mapping:

{ 
    "my_index": { 
    "mappings": { 
    "type": { 
     "properties": { 
      "about": { 
       "properties": { 
       "hobbies": { 
        "type": "string", 
        "analyzer": "lowercase" 
       } 
       } 
      } 
     } 
    } 
    } 
} 

bé giải thích: Tôi có một lĩnh vực mà có thể chứa danh sách các giá trị chuỗi.

"hobbies": ["a","b",c"] 

và nó cũng có thể trống. Tôi muốn có một trường kịch bản kiểu boolean sẽ có giá trị đúng khi danh sách không rỗng, và sai khi danh sách rỗng.

Cập nhật: Đọc một số chi tiết, tôi gặp phải tài liệu này trên lucene expressions scripts

There are a few limitations relative to other script languages:

  • Only numeric fields may be accessed
  • Stored fields are not available
  • If a field is sparse (only some documents contain a value), documents missing the field will have a value of 0

lĩnh vực của tôi là kiểu String, nó có thể là vấn đề? Nếu có, có cách nào khác để sử dụng các trường tập lệnh dựa trên các trường chuỗi không? có thể sử dụng groovy?

+0

hãy chia sẻ các bản đồ .. – Richa

+0

Cảm ơn @Richa. Đã cập nhật. – Tomer

Trả lời

1

Tôi nghĩ rằng vấn đề là trường là đối tượng lồng nhau, nếu tôi đọc tài liệu chính xác thì doc ['field'] chỉ hỗ trợ các trường thuật ngữ đơn giản.

Note, however, that the doc[...] notation only allows for simple valued fields (can’t return a json object from it) and makes sense only on non-analyzed or single term based fields.

Tuy nhiên sử dụng _source đã làm việc cho tôi

"script_fields" : { 
     "field1" : { 
      "script" : "_source.about.hobbies.size() > 0" 
     } 
    }, 
+0

Tôi nghĩ rằng các trường có giá trị đơn giản, tham khảo giá trị, chứ không phải chính trường đó. Vì vậy, tôi không nghĩ đây là vấn đề ở đây. _source luôn là một lựa chọn, điều này là nó kém hiệu quả hơn nhiều bởi vì dữ liệu này không được tìm thấy trong bộ nhớ, và cần được lấy ra khá đắt. – Tomer

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