一尘不染

ElasticSearch-有关字符串字段长度的统计信息

elasticsearch

我想检索有关字符串字段的数据,如最小,最大和平均长度(通过计算字符串中的字符数)。我的问题是聚合只能用于数字字段。此外,我使用简单的统计方面进行了尝试,

 "query":{
      "match_all": {}
  }, 
 "facets":{
      "stat1":{
           "statistical":{
               "field":"title"}
               }
          }

但出现碎片故障和SearchPhaseExecutionException。尝试使用脚本字段时,返回的错误是OutOfMemoryError:

  "query":{
       "match_all": {}
   }, 
  "script_fields":{
       "test1":{"script": "doc[\"title\"].value" }
   }

是否可以使用CURL检索有关简单“ title”字符串字段的此类数据?谢谢!


阅读 1068

收藏
2020-06-22

共1个答案

一尘不染

我实际上没有尝试过以下方法,但我认为它应该可以工作。

首先是一些有用的文档参考:

http://www.elasticsearch.org/guide/zh-
CN/elasticsearch/reference/current/search-facets-statistical-
facet.html。

为了实现统计方面,相关字段值已从索引加载到内存中。这意味着每个分片应该有足够的内存来容纳它们。由于默认情况下,动态引入的类型为long和double,因此减少内存占用的一种方法是在可能的情况下将相关字段的类型显式设置为short,integer或float。

我不确定如何直接将脚本字段的类型设置为“短”,这可能正是您想要的。减少内存。不过应该有可能。

还:http :
//www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-
request-script-
fields.html

了解doc
[‘my_field’]。value和_source.my_field之间的区别很重要。首先,使用doc关键字将导致将该字段的术语加载到内存中(缓存),这将导致执行速度更快,但会占用更多内存。另外,doc表示法仅允许使用简单值字段(无法从中返回json对象),并且仅在未分析或基于单个术语的字段中有意义。

因此,替代:将使用_source而不是doc不缓存长度。

给出:

    {
        "query" : {
            "match_all" : {}
        },
        "facets" : {
            "stat1" : {
                "statistical" : {
                    "script" : "doc['title'].value.length()
                    //"script" : "_source.title.length() //ALTERNATIVE which isn't cached
                }
            }
        }
    }
2020-06-22