【问题标题】:Elasticsearch: How to get the length of a string field(before analysis)?Elasticsearch:如何获取字符串字段的长度(分析前)?
【发布时间】:2016-02-11 07:12:21
【问题描述】:

我的索引有一个包含可变长度随机 id 的字符串字段。显然不应该分析。 但是我对elasticsearch知之甚少,尤其是在创建索引时。 今天尝试了很多根据id的长度过滤文档,终于得到了这个groovy脚本:

doc['myfield'].values.size()

或

doc['myfield'].value.size()

两者都返回神秘数字,我认为这是因为该字段已被分析。 如果真的是这样,有没有什么办法可以得到原始长度或者解决问题,而不需要重建整个索引?

【问题讨论】:

    标签: search elasticsearch full-text-search analysis


    【解决方案1】:

    使用_source 代替doc。那是使用文档的来源,即初始索引文本:

    _source['myfield'].value.size()
    

    如果可能,尝试将文档重新索引到:

    • 在该字段的not-analyzed 版本上使用doc[field]
    • 更好的是,在为文档编制索引之前找出字段的大小,并考虑将其大小作为常规字段添加到文档本身中

    【讨论】:

    • 当然会@vineeth-mohan。 ES 中的 scripts 也是如此。但是脚本有它们的位置,可以克服事先没有经过深思熟虑的集群数据设计。而且,理想情况下,该大小应该与作为常规字段的文档同时被索引,以克服性能损失。
    • 我刚刚尝试了 _source['myfield'].value,它显示“无法在空对象上获取属性 'value'”。不知道为什么 _source['myfield'] 为空。
    • 那你的字段好像没有存储。
    • @AndreiStefan - doc['myfield'] 从主内存中获取数据,并且比 _source['myfield'] 快得多。
    • 这对我不起作用。我使用 ES 1.7,只需将 doc['text'].value.length() > 200 更改为 _source['text'].value.length() > 200 我得到一个 GroovyRuntimeException 告诉我 GroovyScriptExecutionException[MissingMethodException[No signature of method: [C.length() is applicable for argument types: () values: []
    【解决方案2】:

    Elasticsearch 将字符串作为标记化存储在我们可以访问脚本的数据结构(字段数据缓存)中。

    所以假设你的字段不是 not_analyzed , doc['field'].values 看起来像这样

    "In america" => [ "in" , "america" ]
    

    因此你从 doc['field'].values 得到的是一个数组而不是一个字符串。

    现在,即使您只有一个标记或字段为 not_analyzed,故事也不会改变。

    "america" => [ "america" ]
    

    现在要查看第一个令牌的大小,可以使用以下请求

    {
      "script_fields": {
        "test1": {
          "script": "doc['field'].values[0].size()"
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多