English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Elasticsearch DSL Ricerca

La ricerca in Elasticsearch viene effettuata utilizzando query basate su JSON. Le query sono composte da due frasi-

  • Frase di query foglia - queste frasi sono corrispondenze, termini o intervallo, che cercano valori specifici in campi specifici.

  • Frase di query complessa - queste query sono la combinazione di frasi di query foglie e query complesse, utilizzate per estrarre le informazioni necessarie.

Elasticsearch supporta una vasta gamma di query. Le query iniziano con una parola chiave di ricerca e sono contenute in forma di oggetto JSON che contiene condizioni e filtri. Di seguito sono descritte le diverse tipi di query.

Ricerca di corrispondenza completa

Questa è la query più semplice; restituisce tutto il contenuto con un punteggio di 1.0 per ogni oggetto.

POST /schools/_search
{
   "query": {
      "match_all":{}
   }
}

Eseguendo il codice sopra, otteniamo i seguenti risultati-

{
   "took": 7,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 2,
         "relation": "eq"
      },
      "max_score": 1.0,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "5",
            "_score": 1.0,
            "_source": {
               "name": "Central School",
               "description": "CBSE Affiliation",
               "street": "Nagan",
               "city": "paprola",
               "state": "HP",
               "zip": "176115",
               "location": [
                  31.8955385,
                  76.8380405
               ],
               "fees": 2200,
               "tags": [
                  "Senior Secondary"
                  "beautiful campus"
               ],
               "rating": "3.3"
            }
         },
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 1.0,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Ricerca di testo completo

Queste query vengono utilizzate per cercare il testo completo, ad esempio capitoli o articoli di notizie. La query lavora secondo l'analizzatore associato a un indice o documento specifico. In questa sezione, discuteremo i diversi tipi di ricerche di testo completo.

Ricerca di corrispondenza

Questa query corrisponde ai testi o alle espressioni di un campo o più campi.

POST /schools*/_search
{
   "query": {
      "match": {
         "rating":"4.5"
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 44,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 0.47000363,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 0.47000363,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Ricerca multipla

Questa query corrisponde ai testi o alle espressioni di una o più campi.

POST /schools*/_search
{
   "query": {
      "multi_match": {
         "query": "paprola",
         "fields": ["city", "state"]
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 12,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 0.9808292,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "5",
            "_score": 0.9808292,
            "_source": {
               "name": "Central School",
               "description": "CBSE Affiliation",
               "street": "Nagan",
               "city": "paprola",
               "state": "HP",
               "zip": "176115",
               "location": [
                  31.8955385,
                  76.8380405
               ],
               "fees": 2200,
               "tags": [
                  "Senior Secondary"
                  "beautiful campus"
               ],
               "rating": "3.3"
            }
         }
      ]
   }
}

Query di stringa di ricerca

Questa query utilizza il parser di query e la chiave query_string.

POST /schools*/_search
{
   "query": {
      "query_string": {
         "query":"beautiful"
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 60,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
      "value": 1,
      "relation": "eq"
   },
………………………………….

Query a livello di parola

Queste query trattano principalmente dati strutturati, come numeri, date e enumerazioni.

POST /schools*/_search
{
   "query": {
      "term":{"zip":"176115"}
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

……………………………..
"hits": [
   {
      "_index": "schools",
      "_type": "school",
      "_id": "5",
      "_score": 0.9808292,
      "_source": {
         "name": "Central School",
         "description": "CBSE Affiliation",
         "street": "Nagan",
         "city": "paprola",
         "state": "HP",
         "zip": "176115",
         "location": [
            31.8955385,
            76.8380405
         ],
      }
   }
]   
…………………………………………..

Query di intervallo

Questa query viene utilizzata per trovare oggetti con valori tra intervalli specificati. Per questo, dobbiamo utilizzare operatori come-

  • gte −maggiore o uguale a

  • gt −maggiore di

  • lte −minore o uguale a

  • lt −minore di

Ad esempio, osserviamo il codice fornito-

POST /schools*/_search
{
   "query": {
      "range": {
         "rating": {
            "gte": 3.5
         }
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 24,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 1,
         "relation": "eq"
      },
      "max_score": 1.0,
      "hits": []
         {
            "_index": "schools",
            "_type": "school",
            "_id": "4",
            "_score": 1.0,
            "_source": {
               "name": "City Best School",
               "description": "ICSE",
               "street": "West End",
               "city": "Meerut",
               "state": "UP",
               "zip": "250002",
               "location": [
                  28.9926174,
                  77.692485
               ],
               "fees": 3500,
               "tags": [
                  "fully computerized"
               ],
               "rating": "4.5"
            }
         }
      ]
   }
}

Esistono altri tipi di query di livello terminologico, ad esempio-

  • Query di esistenza −Se un campo ha un valore non vuoto.

  • Query mancanti −Questo è l'opposto della query di esistenza, che cerca oggetti senza campo specifico o con valore vuoto.

  • Query di jolly o regexp −Questa query utilizza l'espressione regolare per cercare modelli negli oggetti.

Query complesse

Queste query sono un insieme di diverse query, che si combinano tra loro utilizzando operatori booleani (ad esempio AND / OR, NOT) o su diversi indici o con chiamate a funzioni, ecc.

POST /schools/_search
{
   "query": {
      "bool": {
         "must": {
            "term": {  "state": "UP"  }
         },
         "filter": {
            "term": {  "fees": "2200"  }
         },
         "minimum_should_match": 1,
         "boost": 1.0
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 6,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 0,
         "relation": "eq"
      },
      "max_score": null,
      "hits": [  ]
   }
}

Query geografiche

Queste query trattano posizioni geografiche e oggetti geografici. Queste query aiutano a trovare oggetti geografici vicini a scuole o qualsiasi altra posizione geografica. Devi utilizzare il tipo di dati geografici.

PUT /geo_example
{
   "mappings": {
      "properties": {
         "location": {
            "type": "geo_shape"
         }
      }
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{    "acknowledged": true,
   "shards_acknowledged": true,
   "index": "geo_example"
}

Ora, pubblicheremo i dati nell'indice creato in precedenza.

POST /geo_example/_doc?refresh
{
   "name": "Capitolo Uno, Londra, Regno Unito",
   "location": {
      "type": "point",
      "coordinates": [11.660544, 57.800286]
   }
}

Dopo l'esecuzione del codice sopra riportato, otteniamo la seguente risposta:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": {
         "value": 2,
         "relation": "eq"
      },
      "max_score": 1.0,
      "hits": []
         "_index": "geo_example",
         "_type": "_doc",
         "_id": "hASWZ2oBbkdGzVfiXHKD",
         "_score": 1.0,
         "_source": {
            "name": "Capitolo Uno, Londra, Regno Unito",
            "location": {
               "type": "point",
               "coordinates": [
                  11.660544,
                  57.800286
               ]
            }
         }
      }
   }