【问题标题】:Term Aggregations in Elasticsearch Returning Buckets for Words Instead of Full Field ValuesElasticsearch 中的术语聚合返回单词而不是完整字段值的存储桶
【发布时间】:2016-01-15 17:35:33
【问题描述】:

我有一个使用术语聚合的弹性搜索查询:

{
    "query" : {
        "match_all" : {}                        
    },
    "aggregations" : {
        "tag" : {
            "terms" : {
                "field": "persona"      
            }
        }
    }
}

查询结果中样本命中的_source如下所示:

"_source": {
    "facets": {
        "persona": "research manager",
        "research type": "qualitative"
    },
    "name": "Joe Doe"
}

聚合桶如下所示:

"facets": {
    "tag": {
        "_type": "terms",
        "missing": 0,
        "other": 0,
        "terms": [
            {
                "count": 2,
                "term": "research"
            },
            {
                "count": 2,
                "term": "manager"
            }
        ],
        "total": 4
    }
}

术语聚合是考虑角色字段中的单词而不是字段的整个值。这是预期的输出:

...
"terms" : [
      {
        "term" : "research manager",
        "count" : 2
      },
      ...
]
....

我做错了吗?有没有办法做到这一点?

【问题讨论】:

  • 我刚刚注意到您的 Elasticsearch 记录中发生了一些奇怪的事情……角色在 facets 对象中。我们能看到这个映射吗?

标签: aggregation elasticsearch


【解决方案1】:

正如 bittusarkar 所提到的,角色字段很可能会被分析。如果您没有在映射中指定映射或有关该字段的信息,则 Elasticsearch 会将其动态添加到映射中,类型为 string,默认为 Standard Analyzer。分析器包含标准标记器,它比空白标记器做得更多,但基本上您的字段内容被视为“词袋”。

通常,对于全文搜索/Elasticsearch 查询,您确实希望对内容进行分析,以便在搜索“经理”时匹配“研究经理”。

一种解决方案是使用multi-fields。关于角色字段的映射的 sn-p 可能如下所示:

"persona": {
    "type": "multi_field",
    "fields": {
        "persona": { "type": "string" },
        "raw":   { "type": "string", "index": "not_analyzed" }
    }
}

这样你就可以进行如下搜索:

{
    "query" : {
        "match" : {
            "persona" : "Managers"
        }
    }
}

同时你可以使用聚合:

{
    "query" : {
        "match_all" : {}
    },
    "aggregations" : {
        "tag" : {
            "terms" : {
                "field": "persona.raw"      
            }
        }
    }
}

请注意,您使用 persona.raw 代替 persona 来表示术语聚合。

【讨论】:

    【解决方案2】:

    很可能对“角色”字段进行了分析。映射“样本”的定义应予以确认。 Terms aggregation 适用于非分析领域。如果对字段“persona”进行分析,则在索引中将其保存为两个不同的单词“research”和“manager”。要获得您想要的,您必须将“角色”字段更改为未分析。请参阅this 了解更多信息。恐怕您无法动态地在映射中进行此更改。您需要使用更新后的映射重新索引所有文档,以使更改生效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-29
      • 2019-10-31
      • 2014-05-12
      • 2021-06-06
      • 2021-07-11
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多