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"
        }
      }
    }
  }
}