elasticsearch - 聚合返回键中的术语,但不返回完整的字段,如何返回完整字段?

时间:2014-07-08 19:23:45

标签: elasticsearch aggregation

在弹性搜索实现中,我在几个字段的基础上进行了很少的简单聚合,如下所示 -

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

聚合工作正常,我得到相应的结果。但返回的标题关键字段(或任何其他字段 - 多字),具有单字汇总和结果。我需要返回结果中的完整标题,而不是一个单词 - 这没有多大意义。我怎么能得到它。

当前结果(只是一个片段) -

"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
        } ] }

预期结果 -

"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
            } }

我经历了很多文档,它解释了聚合结果的不同方法,但是我无法找到如果获得全文的结果,如果键中的字段结果,请告知我该如何实现?

3 个答案:

答案 0 :(得分:28)

您需要在索引中使用未标注的术语副本,在地图使用中使用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"
                            }
                        }
                    }
                }
            }
        }
    }
}

在您的聚合查询中引用未加密的字段:

"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
        }
    }
}

答案 1 :(得分:0)

答案 2 :(得分:0)

我遇到了类似的问题。 当我运行命令时:

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

响应中有以下内容,这很有用:

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

我意识到,添加.raw应该更改输出并获得所需的输出。

如下所示:

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

我的诀窍。

对弹性搜索的新手,但我看到许多字符串字段有一个“原始”字段,可以在查询中使用。

如果有专家能够阐明我的发现,那将是件好事。正确/部分正确/错误?!