2014-10-27 16 views
5

Tôi có một miền đám mây amazon. Mục đích là để lọc nếu trường 'ngôn ngữ' tồn tại. Không phải tất cả các đối tượng đều có ngôn ngữ và tôi muốn có các ngôn ngữ có ngôn ngữ được lọc, nhưng những ngôn ngữ không có bất kỳ ngôn ngữ nào cũng được trả lại.Amazon Cloudsearch: Bộ lọc nếu tồn tại

Tôi muốn lọc với (hoặc ngôn ngữ: 'en' ngôn ngữ: null)

Tuy nhiên rỗng không thể được thông qua trong một chuỗi.

Điều này có khả thi không? Nếu vậy làm thế nào nó sẽ được thực hiện.

Trả lời

4

Tôi nhìn nơi khác là tốt, có vẻ như:

Cách đơn giản nhất để làm điều đó, là để thiết lập một giá trị mặc định cho lĩnh vực này, và sau đó sử dụng giá trị null của bạn.

Ví dụ: đặt mặc định thành chuỗi "null", sau đó bạn có thể dễ dàng kiểm tra điều đó.

Tôi tin rằng bạn có thể thêm giá trị mặc định và lập lại chỉ mục và điều đó sẽ áp dụng lại mặc định.

+0

tại sao downvote? – user1628284

2

Không có cách nào để sạch thực hiện chính xác những gì bạn muốn, nhưng đây là hai lựa chọn:

  1. Index một lĩnh vực mới được gọi là một cái gì đó giống như has_language, thiết lập giá trị của nó để language!=null lúc nộp doc.
  2. Đây là một hack vì phạm vi chỉ nên được sử dụng với số nguyên, nhưng tôi đã sử dụng nó thành công trên các trường chữ (range field=language [0,}).
3

Nếu bạn sẵn sàng để sử dụng các phân tích cú pháp truy vấn Lucene bạn có thể thể hiện truy vấn của bạn như thế này:

(*:* OR -language:*) OR language:en

Lưu ý: sôi nổi (*:* OR ...) xây dựng là cần thiết vì cách xử lý Lucene phủ nhận HOẶC khoản.

Nói chung, bạn có thể lọc theo sự tồn tại/không tồn tại của một lĩnh vực với các phân tích cú pháp Lucene truy vấn:

Tất cả các tài liệu có chứa field: field:[* TO *]

Tất cả các tài liệu không chứa field: -field:[* TO *]

Lưu ý: Nếu field là văn bản (kiểu dữ liệu văn bản hoặc chữ) bạn không cần truy vấn phạm vi và bạn có thể rút ngắn các câu hỏi ở trên thành:

field:*-field:*

+0

Đây phải là câu trả lời được chấp nhận cho câu hỏi này. –

1

Bạn có thể tìm kiếm sự tồn tại bằng cách sử dụng các prefix hoặc range nhà khai thác tùy thuộc vào loại lĩnh vực của bạn. Nếu loại là một thuật ngữ hoặc một chuỗi sau đó bạn có thể sử dụng tiền tố như vậy:

(prefix field=example '') 

này sẽ mang lại kết quả chỉ có không phải là null cho trường example.

Đối ngày bạn có thể sử dụng một phạm vi ngày bao gồm:

(range field=updated ['0000-01-01T00:00:00.000Z',}) 

này sẽ chỉ bao gồm các mặt hàng với một ngày updated sau thời gian nhất định, mục có một ngày vô cập nhật sẽ không được đưa vào. Bạn có thể thực hiện các tìm kiếm tương tự khác cho các loại trường khác.

Tương tự, bạn có thể sử dụng toán tử not để nhận tập hợp các mục có trường rỗng.

Ví dụ, tất cả các mục có một example lĩnh vực null:

(not (prefix field=example '')) 
Các vấn đề liên quan