web-dev-qa-db-fra.com

elasticsearch - L'agrégation renvoie les termes en clé, mais pas le champ complet, comment puis-je obtenir le champ complet?

Dans l'implémentation de elasticsearch, j'ai quelques agrégations simples sur la base de quelques champs, comme indiqué ci-dessous -

 "aggs" : {
    "author" : {
        "terms" : { "field" : "author" 
          , "size": 20,
          "order" : { "_term" : "asc" }
        }
    },
    "title" : {
        "terms" : { "field" : "title" 
          , "size": 20
        }
    },
    "contentType" : {
        "terms" : { "field" : "docType" 
          , "size": 20
        }
    }
}

Les agrégations fonctionnent bien et j’obtiens les résultats en conséquence. mais le champ clé de titre renvoyé (ou tout autre champ - plusieurs mots) contient une agrégation et des résultats uniques. J'ai besoin du titre complet dans le résultat renvoyé, plutôt que d'un mot - ce qui n'a pas beaucoup de sens. comment puis-je l'obtenir.

Résultats actuels (juste un extrait) - 

"title": {
     "buckets": [
        {
           "key": "test",
           "doc_count": 1716
        },
        {
           "key": "pptx",
           "doc_count": 1247
        },
        {
           "key": "and",
           "doc_count": 661
        },
        {
           "key": "for",
           "doc_count": 489
        },
        {
           "key": "mobile",
           "doc_count": 487
        },
        {
           "key": "docx",
           "doc_count": 486
        },
        {
           "key": "pdf",
           "doc_count": 450
        },
        {
           "key": "2012",
           "doc_count": 397
        } ] }

résultats attendus -

"title": {
         "buckets": [
            {
               "key": "test document for stack overflow ",
               "doc_count": 1716
            },
            {
               "key": "this is a pptx",
               "doc_count": 1247
            },
            {
               "key": "its another document and so on",
               "doc_count": 661
            },
            {
               "key": "for",
               "doc_count": 489
            },
            {
               "key": "mobile",
               "doc_count": 487
            },
            {
               "key": "docx",
               "doc_count": 486
            },
            {
               "key": "pdf",
               "doc_count": 450
            },
            {
               "key": "2012",
               "doc_count": 397
            } }

J'ai parcouru pas mal de documentation, elle explique différentes manières d'agréger les résultats, mais je ne trouvais pas comment obtenir le texte intégral si un champ était entré au résultat. 

26
dev123

Vous devez disposer de copies sans légende des termes de l'index. Dans votre mappage, utilisez multi-fields :

{
    "test": {
        "mappings": {
            "book": {
                "properties": {                
                    "author": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    },
                    "title": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    },
                    "docType": {
                        "type": "string",
                        "fields": {
                            "untouched": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    }
                }
            }
        }
    }
}

Dans votre requête d'agrégation, faites référence aux champs sans tabou:

"aggs" : {
    "author" : {
         "terms" : { 
            "field" : "author.untouched", 
            "size": 20,
            "order" : { "_term" : "asc" }
        }
     },
    "title" : {
        "terms" : { 
          "field" : "title.untouched", 
          "size": 20
        }
    },
    "contentType" : {
        "terms" : { 
           "field" : "docType.untouched", 
           "size": 20
        }
    }
}
28
Dan Tuffery

il semble que les champs multiples spécifiés dans l'article ci-dessus soient obsolètes http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/_multi_fields.html#_multi_fields

0
Ankireddy Polu

J'ai rencontré un problème similaire . Lorsque j'ai lancé la commande:

   curl -XGET "localhost:9200/logstash*/_mapping?pretty"

ce qui a été utile dans la réponse:

   "Host" : {
     "type" : "string",
       "norms" : {
         "enabled" : false
       },
       "fields" : {
         "raw" : {
           "type" : "string",
           "index" : "not_analyzed",
           "ignore_above" : 256
         }
       }
     },...

J'ai réalisé que l'ajout de .raw devrait changer la sortie et obtenir la sortie désirée.

donc quelque chose comme:

      "aggs": {
        "computes": {
          "terms": {
            "field": "Host.raw",
            "size": 0
          }
        }         
      }

A fait le tour pour moi. 

Débutant dans elasticsearch, mais je constate que de nombreux champs de type chaîne ont un champ "brut" pouvant être utilisé dans une requête.

Ce serait bien que certains experts puissent éclaircir mes conclusions. Correct/partiellement correct/faux?!

0
rms_13