关于搜索,我们聊聊ES

elasticsearch 中的 ignore_above

2015-10-14  本文已影响5132人  朱小虎XiaohuZhu

Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

今天遇到一个异常

java.lang.IllegalArgumentException: Document contains at least one immense term in field="title.notanalyzed_title" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped.

检查了一下发现是因为对 not_analyzed 字符串字段默认设置,以及出现了超长的标题所致。根本原因在于标题没有一个空格,es将其当成了整个的词

查看 elasticsearch 的文档,详述如下:

ignore_above

对超过 ignore_above 的字符串,analyzer 不会进行处理;所以就不会索引起来。导致的结果就是最终搜索引擎搜索不到了。这个选项主要对 not_analyzed 字段有用,这些字段通常用来进行过滤、聚合和排序。而且这些字段都是结构化的,所以一般不会允许在这些字段中索引过长的项。

PUT my_index
{
  "mappings": {
    "my_type": {
      "properties": {
        "message": {
          "type": "string",
          "index": "not_analyzed",
          "ignore_above": 20                ...... (1)
        }
      }
    }
  }
}

PUT my_index/my_type/1               ...... (2)
{
  "message": "Syntax error"
}

PUT my_index/my_type/2               ...... (3)
{
  "message": "Syntax error with some long stacktrace"
}

GET _search                                    ...... (4)
{
  "aggs": {
    "messages": {
      "terms": {
        "field": "message"
      }
    }
  }
}

(1) 这个字段忽略所有长度超过 20 的字符串
(2) 这个文档会被成功索引
(3) 这个文档会被索引,但是 message 字段却不会被索引
(4) 搜索会返回这两个问答是哪个,但是只有第一个会出现在项的聚合

ignore_aboe 设置允许针对统一索引中的同样名称的字段设置不同的值。可以使用 PUT mapping API 来更新已经存在的字段。

这个选项在保护 Lucene 的项的字节长度限制 32766 发挥作用。

ignore_above 值表示字符个数,但是 Lucene 计算的是字节数。如果你使用包含很多非 ASCII 字符的 UTF-8 文本,你应该将这个限制设置成 32766 / 3 = 10922 因为 UTF-8 字符可能最多占用 3 个字节。

上一篇 下一篇

猜你喜欢

热点阅读