2013-03-21 18 views

Trả lời

36

Tôi sẽ xem xét số script filter. Bộ lọc sau chỉ trả về các tài liệu có ít nhất 10 phần tử trong trường fieldname, là một mảng. Hãy nhớ rằng điều này có thể tốn kém tùy thuộc vào số lượng tài liệu bạn có trong chỉ mục của mình.

"filter" : { 
    "script" : { 
     "script" : "doc['fieldname'].values.length > 10" 
    } 
} 

Về câu hỏi thứ hai: bạn có thực sự có một mảng trống không? Hay nó chỉ là một trường mảng không có giá trị? Bạn có thể sử dụng missing filter để có được tài liệu mà không có giá trị cho một lĩnh vực cụ thể:

"filter" : { 
    "missing" : { "field" : "user" } 
} 

Nếu tôi đoán bạn cần phải sử dụng kịch bản một lần nữa, tương tự như những gì tôi đã gợi ý ở trên, chỉ với chiều dài khác nhau như đầu vào. Nếu chiều dài là hằng số tôi muốn đặt nó trong phần params để kịch bản sẽ được lưu trữ bởi elasticsearch và tái sử dụng, vì nó luôn luôn giống nhau:

"filter" : { 
    "script" : { 
     "script" : "doc['fieldname'].values.length > param1" 
     "params" : { 
      "param1" : 10 
     } 
    } 
} 
+0

bạn có biết cách thực hiện điều này nếu trường là một chuỗi chứ không phải mảng? Tôi đã thử '" script ":" doc ['title']. value.length()> 10 "' nhưng không may mắn ... –

+1

Tôi có cùng một vấn đề, trường là một mảng, nhưng ES thấy nó là Chuỗi, để nó ném 'groovy.lang.MissingPropertyException: Không có thuộc tính như vậy: độ dài cho lớp: java.lang.String' – lisak

+0

@lisak Hãy thử điều này:" script ":" doc ['fieldname']. size()> 50 " –

6

IMHO cách đúng đắn về mảng lọc theo quy mô sử dụng kịch bản là:

"filter" : { 
    "script" : { 
     "script" : "_source.fieldName.size() > 1" 
    } 
} 

Nếu tôi làm điều đó như @javanna thấy nó ném ngoại lệ groovy.lang.MissingPropertyException: No such property: length for class: java.lang.String

+2

Nguồn chậm hơn nhiều so với tài liệu, nó truy cập đĩa. – whitfin

+0

Ngoài ra, lưu ý rằng bạn đã sử dụng 'fieldName' và những người khác đã sử dụng' fieldname'. – whitfin

+1

Lý do là 'Groovy' cung cấp' size() 'cho cả mảng và chuỗi. Nếu không _all_ của các giá trị của bạn là mảng, thì bạn sẽ chạy vào vấn đề mà bạn đã làm bởi vì bạn đang cố gắng sử dụng một chiều dài _property_ trên một String, mà không tồn tại. – pickypg

10

javanna là đúng trên Elasticsearch 1.3.x trở về trước, kể từ 1,4 mô-đun kịch bản mặc định đã thay đổi để groovy (đã mvel) .

Để trả lời câu hỏi của OP.

On Elasticsearch 1.3.x trở về trước, sử dụng mã này:

"filter" : { 
    "script" : { 
     "script" : "doc['fieldname'].values.length > 10" 
    } 
} 

On Elasticsearch 1.4.x và sau đó, sử dụng mã này:

"filter" : { 
    "script" : { 
     "script" : "doc['fieldname'].values.size() > 10" 
    } 
} 

Ngoài ra, trên Elasticsearch 1.4.3 và sau này, bạn sẽ cần phải kích hoạt kịch bản động vì nó đã bị tắt theo mặc định, vì vấn đề bảo mật. Xem: https://www.elastic.co/guide/en/elasticsearch/reference/1.4/modules-scripting.html

2

Cách dễ nhất để thực hiện điều này là "không chuẩn hóa" dữ liệu của bạn để bạn có thuộc tính chứa số và boolean nếu nó tồn tại hay không. Sau đó, bạn chỉ có thể tìm kiếm trên các thuộc tính đó.

Ví dụ:

{ 
    "id": 31939, 
    "hasAttachments": true, 
    "attachmentCount": 2, 
    "attachments": [ 
     { 
     "type": "Attachment", 
     "name": "txt.txt", 
     "mimeType": "text/plain" 
     }, 
     { 
     "type": "Inline", 
     "name": "jpg.jpg", 
     "mimeType": "image/jpeg" 
     } 
    ] 
} 
1

Tuy gửi bài đến đây cho người bị mắc kẹt cùng hoàn cảnh với tôi. Hãy nói rằng dữ liệu của bạn trông như thế này:

{ 
    "_source": { 
     "fieldName" : [ 
      { 
       "f1": "value 11", 
       "f2": "value 21" 
      }, 
      { 
       "f1": "value 12", 
       "f2": "value 22" 
      } 
     ] 
    } 
} 

Sau đó để lọc fieldName với chiều dài> 1 ví dụ:

"query": { 
    "bool" : { 
     "must" : { 
      "script" : { 
       "script" : { 
        "inline": "doc['fieldName.f1'].values.length > 1", 
        "lang": "painless" 
       } 
      } 
     } 
    } 
} 

Cú pháp kịch bản là như ES 5.4 tài liệu https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-script-query.html.

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