当前位置: 首页 > 面试题库 >

elasticsearch-聚合返回key中的项,但不返回完整字段,如何获得完整字段?

郎魁
2023-03-14
问题内容

在elasticsearch的实现中,基于几个字段,我只有几个简单的聚合,如下所示:

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

我浏览了很多文档,它解释了汇总结果的不同方法,但是如果结果中的字段中有字段,我找不到如何获取全文,请告知我该如何实现?


问题答案:

您需要在索引中具有术语的未标记化副本,在映射中使用多字段:

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


 类似资料:
  • 这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。

  • 123 但是我想要像这样的整个字符串 编辑:添加了,但响应相同。

  • 问题内容: 我在使用VBA执行SQL查询并将结果复制到Excel工作表时遇到问题。 子执行时,它仅复制256的倍数的行(因此,只有256、512、768等行是填充到Excel中的行)。我从数据库中复制任何其他字段都没有问题。另外,当我在MySQL中运行相同的查询时,它也可以正常工作。对于SQL和VBA来说都是相当新的东西,我看不到任何原因导致此特定字段引起麻烦。我唯一能想到的是它的内容是一个始终以

  • 问题内容: 我最近开始使用ElasticSearch。我尝试完成一些用例。我对其中一个有问题。 我已经用他们的全名为一些用户建立了索引(例如“ Jean-Paul Gautier”,“ Jean De La Fontaine”)。 我尝试让所有全名响应某个查询。 例如,我希望以“ J”开头的100个最全名 我得到的结果是全名的所有单词:“ Jean”,“ Paul”,“ Gautier”,“ De

  • 有人能解释一下为什么我通过Postman和http从外部http API得到不同的响应吗。NetCore web Api HttpClient。 这是一个密码 结果是 但Postman返回完整有效的json结果。 为什么结果从。NetCore HttpClient是部分的? 我已经尝试了指定请求头这样的选项: 还补充道: 没有帮助。

  • 问题内容: 如何在结果中返回特定字段的标记 例如,一个GET请求 退货 我想在结果中包含“ _source.message”字段的标记 问题答案: 使用以下script_fields脚本还有另一种方法: 重要的是要注意,尽管此脚本返回已被索引的实际术语,但它也会缓存所有字段值,并且在大索引上会占用大量内存。因此,在较大的索引上,使用以下MVEL脚本从存储的字段或源中检索字段值并快速重新解析它们可能