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

Elasticsearch字段数据-我应该使用它吗?

顾昊穹
2023-03-14
问题内容

给定包含具有 品牌 属性的文档的索引,我们需要创建不区分大小写的术语聚合。

索引定义

请注意,使用 fielddata

PUT demo_products
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "product": {
      "properties": {
        "brand": {
          "type": "text",
          "analyzer": "my_custom_analyzer",
          "fielddata": true,
        }
      }
    }
  }
}

数据

POST demo_products/product
{
  "brand": "New York Jets"
}

POST demo_products/product
{
  "brand": "new york jets"
}

POST demo_products/product
{
  "brand": "Washington Redskins"
}

询问

GET demo_products/product/_search
{
  "size": 0,
  "aggs": {
    "brand_facet": {
      "terms": {
        "field": "brand"
      }
    }
  }
}

结果

"aggregations": {
    "brand_facet": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "new york jets",
          "doc_count": 2
        },
        {
          "key": "washington redskins",
          "doc_count": 1
        }
      ]
    }
  }

如果使用keyword而不是,text由于机壳的差异,我们最终要为纽约喷气机找到2个水桶。

我们担心使用字段数据会影响性能。但是,如果禁用了fielddata,我们将得到可怕的 “默认情况下在文本字段上禁用Fielddata”。

还有其他解决此问题的技巧-还是我们不应该太在意fielddate?


问题答案:

从ES
5.2(今天起)开始,可以对字段使用规范化器,keyword以便(例如)将值小写。

规范化器的作用有点像text字段分析器,尽管您可以用它们做些限制,但是这可能会帮助您解决所面临的问题。

您可以这样创建索引:

PUT demo_products
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "filter": [ "lowercase" ]
        }
      }
    }
  },
  "mappings": {
    "product": {
      "properties": {
        "brand": {
          "type": "keyword",
          "normalizer": "my_normalizer"
        }
      }
    }
  }
}

您的查询将返回以下内容:

  "aggregations" : {
    "brand_facet" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "new york jets",
          "doc_count" : 2
        },
        {
          "key" : "washington redskins",
          "doc_count" : 1
        }
      ]
    }
  }

两全其美!



 类似资料:
  • 问题内容: 我正在使用带有笑话的elasticsearch(作为Java客户端)。我需要嵌套文档中的某些字段,由于无法将嵌套字段成对出现,因此需要’_source’来获取它们。 这是在ES查询 链接中获取它们的先前问题,并且效果很好。 但是无法将其查询转换为开玩笑的代码。下面是我的尝试。 问题答案: 尝试像这样使用:

  • 请帮助解决此错误... 因为我在该对象上使用了bigdecimal类型,而没有添加一个操作@字段(type=FieldType.Double) 有没有办法配置默认的FieldType。大十进制加倍?或者我们需要在每个大十进制中添加字段注释

  • 问题内容: 我是Elasticsearch的新手,正在尝试使用和字段创建多字段索引。有了这些字段,它们都工作得很好,但是当我尝试在数组中获取一些结果时,它返回一个空的数组。 我的资料: 对应: 搜索: 期望: 按,或搜索,应返回结果 搜索应返回结果 搜索应返回结果 搜索依据不应返回结果 我想念什么? 问题答案: Cross_fields具有约束,所有字段应具有相同的搜索分析器,或者所有查询项应出现

  • 问题内容: 在为数据库(例如MySQL)设计模式时,会出现一个问题,即是否要完全规范化表。 一方面,联接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致情况。 这里“最优化”是正确的方法吗?即创建一个书本归一化数据库,然后查看可以进行归一化以实现最佳速度增益的内容。 对于这种方法,我的担心是,我将选择一个可能不够快的数据库设计- 但是在那个阶段重构模式(同时支持现有数据)将非常痛

  • 问题内容: 我的数据库中有以下两个表(索引 不 完整,因为它将基于我使用的引擎): 表格1: 表2: 表1将用于创建缩略图库,其中包含指向较大版本图像的链接。,,和将优化显示的缩略图。 表2包含 与 表1中的图像 相关的 图像。因此,使用关联表1中的单个图像和表2中的一个或多个图像。这就是我考虑使用InnoDB外键功能的地方,但是我我也熟悉MyISAM中索引的功能。 无需过多研究其余字段,就可以对

  • 问题内容: 有没有使用启动文件的理由,还是应该使用? 我了解这可以启动特定的容器,但是我指的是在不指定容器的情况下使用它的情况,这样它就可以启动所有yml容器。 问题答案: 如(2015)中所述 运行传递的命令将覆盖服务配置中定义的命令 。 例如,如果Web服务配置以开头,则用覆盖它。 第二个区别是该命令 不创建服务配置中指定的任何端口 。 这样可以防止端口与已经打开的端口发生冲突。如果确实要创建