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
似乎是使用默认分析器编制索引的,该分析器在单词边界处断开输入字符串并将其小写。因此,在您的情况下,索引标记将是 "consulting"、"recruitment"、"professional"、"services"、"education" 和 "training"。 Term aggregation 选择已编入索引的标记。因此它只选择 "consulting" 而不是 "Consulting & Recruitment"。解决此问题的方法是使字段 industry
不被分析。在这种情况下,令牌 "Consulting & Recruitment"、"Professional Services"、"Education & Training" 将按原样编入索引,您将获得预期的结果。
检查此字段的分析器,我相信它设置为标准左右。
因此,您的内容被分解为表示标记的单词,并且在聚合时不会将像“&”这样的常见动词视为 token/key。
Elastic 搜索使用这些标记('recruitment'、'consultants')为您的文档编制索引。
因此,根据 elastic-search 的主要功能,这种行为是符合预期的;
也就是说,当通过关键字 'consulting' 搜索时,ES 将 return 具有相关分数的文档或包含关键字 'consulting' 的简单单词。
如果您坚持将 "Consulting & Recruitment" 作为一个完整的密钥或令牌来获取,那么您需要阻止分词器将其拆分为多个项。
检查 pattern tokenizer,以自定义将它们拆分为不同标记的方式。
这就像设计一个分词器将 "Consulting & Recruitment" 视为一个大词,但这样你的分词就不会被很好地定义,因此你的搜索可能会受到影响。
一个解决方案是您可以更改数据格式,使用代表每个行业的行业类型代码,并使用另一个字段作为行业名称来包含您的文本内容。
将字段 industry-type-code 索引为 tokenised/standard,字段 industry-name 作为另一个附加索引。
对于正常的搜索操作,使用字段 industry-name ,对于聚合,使用字段 industry-type-code。
{
"mappings": {
"industries" : {
"properties" : {
"industry-type-code" : {
"type" : "string",
"analyzer": "standard"
},
"industry-name" : {
"type" : "string",
"analyzer": "standard"
}
}
}
}
}
我目前正在为具有如下数据结构的实体编制标签(行业)索引:
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
似乎是使用默认分析器编制索引的,该分析器在单词边界处断开输入字符串并将其小写。因此,在您的情况下,索引标记将是 "consulting"、"recruitment"、"professional"、"services"、"education" 和 "training"。 Term aggregation 选择已编入索引的标记。因此它只选择 "consulting" 而不是 "Consulting & Recruitment"。解决此问题的方法是使字段 industry
不被分析。在这种情况下,令牌 "Consulting & Recruitment"、"Professional Services"、"Education & Training" 将按原样编入索引,您将获得预期的结果。
检查此字段的分析器,我相信它设置为标准左右。 因此,您的内容被分解为表示标记的单词,并且在聚合时不会将像“&”这样的常见动词视为 token/key。
Elastic 搜索使用这些标记('recruitment'、'consultants')为您的文档编制索引。 因此,根据 elastic-search 的主要功能,这种行为是符合预期的; 也就是说,当通过关键字 'consulting' 搜索时,ES 将 return 具有相关分数的文档或包含关键字 'consulting' 的简单单词。
如果您坚持将 "Consulting & Recruitment" 作为一个完整的密钥或令牌来获取,那么您需要阻止分词器将其拆分为多个项。
检查 pattern tokenizer,以自定义将它们拆分为不同标记的方式。 这就像设计一个分词器将 "Consulting & Recruitment" 视为一个大词,但这样你的分词就不会被很好地定义,因此你的搜索可能会受到影响。
一个解决方案是您可以更改数据格式,使用代表每个行业的行业类型代码,并使用另一个字段作为行业名称来包含您的文本内容。 将字段 industry-type-code 索引为 tokenised/standard,字段 industry-name 作为另一个附加索引。 对于正常的搜索操作,使用字段 industry-name ,对于聚合,使用字段 industry-type-code。
{
"mappings": {
"industries" : {
"properties" : {
"industry-type-code" : {
"type" : "string",
"analyzer": "standard"
},
"industry-name" : {
"type" : "string",
"analyzer": "standard"
}
}
}
}
}