繁体   English   中英

Elasticsearch Java API术语聚合怪异

[英]Elasticsearch Java API Terms aggregation weirdness

我目前正在为具有这样的数据结构的实体索引标签(行业):

industry: ["Consulting & Recruitment","Professional Services","Education & Training"] 

我正在将termsAggregation应用于查询为:

AggregationBuilders.terms("industry").field("industry");

我期望得出的结果是:

Key: "Consulting & Recruitment"
docCount: 100

我实际得到的是:

Key: "Consulting"
docCount: 100
Key: "Recruitment"
docCount: 100.

有没有办法纠正这个问题?

谢谢

看起来好像是使用默认的分析器索引了现场industry ,该分析器在单词边界处打断了输入字符串,并将它们小写。 因此,在您的情况下,索引的令牌将是“咨询”,“招聘”,“专业”,“服务”,“教育”和“培训”。 术语聚合选择被索引的令牌。 因此,它只选择“咨询”而不是“咨询与招聘”。 解决此问题的方法将是不对现场industry进行分析。 在这种情况下,令牌“咨询与招聘”,“专业服务”,“教育与培训”将按原样编制索引,您将获得预期的结果。

检查分析仪的该字段,我相信将其设置为“标准”左右。 因此,您的内容被分解为表示标记的单词,并且诸如“&”之类的常见动词在聚合时不被视为标记/键。

弹性搜索使用这些标记(“招聘”,“顾问”)为您的文档建立索引。 因此,根据弹性搜索的主要功能,此行为是预期的。 也就是说,当通过关键字“咨询”进行搜索时,ES将返回具有相关分数的文档或包含关键字“咨询”的简单单词。

如果您坚持要获得“咨询与招聘”作为整体的钥匙或令牌,那么您需要阻止令牌生成器将其拆分为多个术语。

检查模式令牌生成器 ,以自定义将它们拆分为不同令牌的方式。 这就像设计令牌生成器一样,将“咨询与招聘”视为一个大词,但是这样您的令牌就无法很好地定义,因此搜索可能会受到影响。

一种解决方案是,您可以更改数据格式,使用代表每个行业的行业类型代码,并使用另一个字段作为行业名称来显示文本内容。 用现场行业类型代码作为标记化/标准索引文档,并将现场行业名称作为另一个附加索引。 对于常规搜索操作,请使用字段行业名称,对于聚合,请使用字段行业类型代码。

{
  "mappings": {
    "industries" : {
      "properties" : {
        "industry-type-code" : {
          "type" :    "string",
          "analyzer": "standard"
        },
        "industry-name" : {
          "type" :   "string",
          "analyzer": "standard"
        }
      }
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM