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

Elasticsearch关键字以及小写和聚合

况浩邈
2023-03-14
问题内容

我以前用映射“关键字”存储了一些字段。但是,它们是区分大小写的。

为了解决这个问题,可以使用分析仪,例如

{
  "index": {
    "analysis": {
      "analyzer": {
        "keyword_lowercase": {
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }
}

与映射

{
  "properties": {
    "field": {
      "type": "string",
      "analyzer": "keyword_lowercase"
    }
  }
}

但是,按期进行汇总不起作用。

原因:java.lang.IllegalArgumentException:默认情况下,在文本字段上禁用Fielddata。在[a]上设置fielddata
= true,以通过反转取反的索引将字段数据加载到内存中。请注意,这可能会占用大量内存。

它适用于映射type = keyword,但type = keyword似乎不允许分析器。

如何将其索引为小写关键字,但仍可以在不设置fielddata = true的情况下使用聚合?


问题答案:

如果您使用的是ES
5.2或更高版本,则现在可以将normalizers用于keyword字段。只需像这样声明您的索引设置和映射,就可以了

PUT index
{
  "settings": {
    "analysis": {
      "normalizer": {
        "keyword_lowercase": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "type": {
      "properties": {
        "field": {
          "type": "keyword",
          "normalizer": "keyword_lowercase"
        }
      }
    }
  }
}


 类似资料:
  • 我设置了elasticsearch来搜索产品目录的变体。基本上在哪里: Product有许多变体 变量索引json/mapping包含产品名称。 这是我接下来需要的(某种程度上): 我的最后一个任务是按照字母顺序对它们进行排序,但我似乎无法使用聚合器按关键字字段(ASC/DESC)进行排序。

  • 我看到一些关于嵌套字段和聚合的帖子,但它们似乎都没有回答我的问题。所以,如果这是一个重复的问题,请原谅,如果有任何帮助,我们将不胜感激。 我们建立了一个讲座索引,讲座具有以下特点: 讲座可以是面对面(现场)或预先录制(在线) 每个讲座可以有多个章节 这些章节中的每一个都可以由不同的讲师讲解(例如:量子物理的第一章可以由五个不同的讲师讲解,其中三个可能是现场直播,另外两个可能在线) 在线讲座每个讲师

  • 我试图在关键字类型字段上进行不区分大小写的聚合,但在使其工作时遇到了问题。 到目前为止,我尝试的是添加一个名为“小写”的自定义分析器,它使用“关键字”标记器和“小写”过滤器。然后,我在映射中添加了一个名为“use_lowercase”的字段,用于我想要使用的字段。我还想保留现有的“文本”和“关键字”字段组件,因为我可能想在字段中搜索术语。 以下是索引定义,包括自定义分析器: 现在,我添加了两条记录

  • 我试图在elasticsearch中对术语聚合的桶进行排序,不区分大小写。以下是字段映射: 请注意,此处的此数据结构适用于PHP。 聚合如下所示: 这是可行的,但生成的桶是按字典顺序排列的。 我在这里找到了一些有趣的文档,它们解释了如何做到这一点,但这是在对点击进行排序的上下文中,而不是在聚合桶中。 我还是试过了。以下是我创建的分析器: 这里是更新的字段映射,使用分析器有一个名为“sort”的新子

  • elasticSearch搜索:比如,我有一个关键字是“北京地铁”,但是我只想搜索挨着的关键词,比如搜索【北京】或者搜索【地铁】或者在搜索【北京地铁】这种的可以保证能匹配到,但是如果隔词搜索就不让他显示出来,比如:【北地】,【京铁】,这种隔词了,就不让搜索出来如何处理,不采用match_phrase的方法,还有没有更加高效的方法? 我尝试过使用match_phrase可以做到我要的结果,但是mat

  • 我有一个带有动态创建的“关键字”字段的大型ES索引。我需要对这些启用不区分大小写的搜索。我知道分析器不适用于关键字字段,而规范化器将用于它:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html 有没有一种方法可以动态地向字段/映射添加规范化器?我可以通过关闭索引、添加分析器