5

Ho un dominio amazon cloudsearch. L'obiettivo è filtrare se esiste il "linguaggio" del campo. Non tutti gli oggetti hanno una lingua, e voglio avere quelli che hanno una lingua filtrata, ma quelli che non hanno una lingua da restituire.Amazon Cloudsearch: filtro se esiste

voglio filtrare con (o la lingua: 'it' la lingua: null)

Tuttavia nulla non può essere passato all'interno di una stringa.

È possibile? Se sì, come sarebbe fatto?

risposta

4

ho guardato altrove entrava, a quanto pare:

Il modo più semplice per farlo, è quello di impostare un valore predefinito per il campo, e quindi utilizzare tale valore per il vostro nullo.

Ad esempio, impostare il valore predefinito sulla stringa "null", quindi è possibile verificarlo facilmente.

Credo che sia possibile aggiungere un valore predefinito e reindicizzare e che dovrebbe riapplicare il valore predefinito.

+0

perché la downvote? – user1628284

2

Non v'è alcun modo per fare in modo pulito esattamente quello che vuoi, ma qui ci sono due opzioni:

  1. indice un nuovo campo chiamato qualcosa come has_language, impostando il suo valore a language!=null al momento doc sottomissione.
  2. Questo è più di un hack perché l'intervallo deve essere utilizzato solo con numeri interi, ma l'ho usato con successo su campi letterali (range field=language [0,}).
3

Se siete disposti a usare la query parser Lucene potete esprimere la vostra query come questa:

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

Nota: il funky (*:* OR ...) costrutto è necessaria a causa del modo Lucene tratta negato o clausole.

In generale, è possibile filtrare per l'esistenza/non esistenza di un campo con il Lucene interrogazione parser:

tutti i documenti contenenti field: field:[* TO *]

Tutti i documenti che non contengono field: -field:[* TO *]

Nota: se field è testuale (tipi di dati letterali o letterali) non hai bisogno di query di intervallo e puoi ridurre quanto sopra a:

field:* e -field:*

+0

Questa dovrebbe essere la risposta accettata per questa domanda. –

1

È possibile cercare per l'esistenza utilizzando i prefix o range operatori a seconda del tipo di campo. Se il tipo è un termine o una stringa, è possibile utilizzare il prefisso in questo modo:

(prefix field=example '') 

Questo produrrà solo i risultati che non sono nulla per il campo example.

Per le date è possibile utilizzare un intervallo di date inclusiva:

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

Questo sarà solo includere elementi con un updated data dopo il tempo determinato, non saranno inclusi oggetti con una data zero aggiornato. Puoi fare altre ricerche simili per altri tipi di campo.

Analogamente, è possibile utilizzare l'operatore not per ottenere l'insieme di elementi con campi null.

Per esempio, Tutti gli articoli con un example campo nullo:

(not (prefix field=example ''))