IBM Cloud Docs
Ulteriori informazioni sugli indici text

Ulteriori informazioni sugli indici text

La premessa di base per gli indici full text è che un documento è "espanso" in un elenco di coppie key:value indicizzate da Lucene. Questa espansione abilita l'utilizzo della sintassi di ricerca di Lucene come base per la funzionalità di interrogazione.

Questa tecnica supporta le ricerche avanzate, ma presenta alcune limitazioni. Ad esempio, potrebbe non essere sempre chiaro se il contenuto di un documento espanso provenga da singoli elementi o da un array.

Il meccanismo della query risolve questa incertezza preferendo restituire risultati "falsi positivi". In altre parole, se una corrispondenza è stata trovata a causa di una ricerca di un singolo elemento, o di un elemento da un array, la corrispondenza viene considerata un successo.

Come IBM® Cloudant® for IBM Cloud® indici di ricerca, IBM Cloudant Gli indici di interrogazione di type: text sono limitati a 200 risultati quando sottoposti a query.

Conversione selettore

Un'espressione di ricerca Lucene standard potrebbe non implementare completamente la sintassi di query IBM Cloudant basata su JSON desiderata. Pertanto, viene eseguita una conversione tra i due formati.

Nel seguente esempio, la query JSON si avvicina alla frase inglese, Corrispondenza se l'età espressa come numero è maggiore di cinque e minore o uguale a infinito. La query Lucene corrisponde a tale frase, dove il testo _3a nel nome del campo corrisponde al campo age:number ed è un esempio dell'espansione del contenuto del documento menzionata in precedenza.

Consultare la seguente query di esempio da convertire:

{
	"age": {
		"$gt": 5
	}
}

La query Lucene corrispondente

(age_3anumber:{5 TO Infinity])

Un esempio più complesso

L'esempio che segue illustra alcuni punti importanti.

Query JSON da convertire in Lucene

{
	"$or": [
		{
			"age": {
				"$gt": 5
			}
		},
		{
			"twitter": {
				"$exists":true
			}
		},
		{
			"type": {
				"$in": [
					"starch",
					"protein"
				]
			}
		}
	]
}

La prima parte della query JSON è semplice da convertire in Lucene; Il test determina se il campo age ha un valore numerico maggiore di 5. Il carattere { nell'espressione di intervallo indica che il valore 5 non è considerato una corrispondenza.

Per implementare la parte "twitter": {"$exists":true} della query JSON in Lucene, il primo test è determinare se esiste un campo twitter . Tuttavia, il campo potrebbe essere un array o un oggetto, quindi la corrispondenza deve avere esito positivo quando il valore è un array o un oggetto.

Questo requisito significa che il campo $fieldnames deve avere voci che contengono twitter.* o twitter:*. Il carattere . è rappresentato nella query come sequenza di caratteri ASCII _2e. Allo stesso modo, il carattere : viene rappresentato nella query come sequenza di caratteri ASCII _3a. Questa rappresentazione richiede l'utilizzo di una query OR a due clausole per il campo twitter , che termina con _2e* e _3a*. L'implementazione di questa query come due frasi invece di una singola query twitter* impedisce una corrispondenza accidentale con un nome campo come twitter_handle o simile.

L'ultima delle tre clausole principali è una ricerca di starch o protein. Questa ricerca è più complicata. L'operatore $in ha alcune semantiche speciali per i valori di array ereditati dal comportamento di MongoDB . In particolare, l'operatore $in si applica al valore o a qualsiasi valore contenuto in un array denominato dal campo. In questo esempio, l'espressione indica che sia "type":"starch" che "type":["protein"] corrispondono all'argomento di esempio a $in. In precedenza, l'espressione type_3astring era stata convertita in type:string. La seconda frase type_2e_5b_5d_3astring viene convertita in type.[]:string, che è un esempio di indicizzazione di array espansa.

Query Lucene corrispondente spiegata

I commenti " #" non sono una sintassi Lucene valida, ma aiutano a spiegare la creazione della query.

(
	# Search for age > 5
	(age_3anumber:{5 TO Infinity])

	# Search for documents that contain the twitter field
	(($fieldnames:twitter_2e*) OR ($fieldnames:twitter_3a*))

	# Search for type = starch
	(
		((type_3astring:starch) OR (type_2e_5b_5d_3astring:starch))

		# Search for type = protein
		((type_3astring:protein) OR (type_2e_5b_5d_3astring:protein))
	)
)