[英]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.