web-dev-qa-db-fra.com

ElasticSearch: recherche à l'intérieur du tableau d'objets

J'ai un problème avec la requête d'objets dans le tableau. Créons un index très simple, ajoutons un type avec un champ et ajoutons un document avec un tableau d'objets (j'utilise la console sense):

PUT /test/
PUT /test/test/_mapping
{
    "test": {
        "properties": {
            "parent": {"type": "object"}
        }
    }
}
Post /test/test
 {
     "parent": [
                  {
                     "name": "turkey",
                     "label": "Turkey"
                  },
                  {
                     "name": "turkey,mugla-province",
                     "label": "Mugla (province)"
                  }
               ]
 }   

Maintenant, je veux rechercher par les deux noms "turkey" et "turkey,mugla-province". La première requête fonctionne bien:

GET /test/test/_search {"query":{ "term": {"parent.name": "turkey"}}}

Mais le second ne renvoie rien:

GET /test/test/_search {"query":{ "term": {"parent.name": "turkey,mugla-province"}}}

J'ai essayé beaucoup de choses, notamment:

 "parent": {
              "type": "nested",
              "include_in_parent": true,
              "properties": {
                 "label": {
                    "type": "string",
                    "index": "not_analyzed"
                 },
                 "name": {
                    "type": "string",
                    "store": true
                 }
              }
           }

Mais rien n'y fait. Qu'est-ce que je manque?

12
Nikita

Voici une façon de le faire, en utilisant nested docs:

J'ai défini un index comme celui-ci:

PUT /test_index
{
   "mappings": {
      "doc": {
         "properties": {
            "parent": {
               "type": "nested",
               "properties": {
                  "label": {
                     "type": "string"
                  },
                  "name": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}

Indexation de votre document:

PUT /test_index/doc/1
{
   "parent": [
      {
         "name": "turkey",
         "label": "Turkey"
      },
      {
         "name": "turkey,mugla-province",
         "label": "Mugla (province)"
      }
   ]
}

Ensuite, l'une de ces requêtes la renverra:

POST /test_index/_search
{
    "query": {
        "nested": {
           "path": "parent",
           "query": {
               "match": {
                  "parent.name": "turkey"
               }
           }
        }
    }
}

POST /test_index/_search
{
    "query": {
        "nested": {
           "path": "parent",
           "query": {
               "match": {
                  "parent.name": "turkey,mugla-province"
               }
           }
        }
    }
}

Voici le code que j'ai utilisé:

http://sense.qbox.io/Gist/6258f8c9ee64878a1835b3e9ea2b54e5cf6b1d9e

10
Sloan Ahrens

Pour rechercher plusieurs termes, utilisez la requête Termes au lieu de la requête Terme.

"terms" : {
        "tags" : [ "turkey", "mugla-province" ],
        "minimum_should_match" : 1
    }

Il existe différentes façons de construire cette requête, mais c'est la plus simple et la plus élégante de la version actuelle d'ElasticSearch (1.6)