【问题标题】:Retrieve data from Elasticsearch using aggregations where the values contains hyphen使用值包含连字符的聚合从 Elasticsearch 检索数据
【发布时间】:2015-12-17 14:21:08
【问题描述】:

我从事弹性搜索已经有一段时间了……我最近遇到了一个问题。

我想按弹性搜索索引中的特定列进行分组。该特定列的值包含连字符和其他特殊字符。

SearchResponse res1 = client.prepareSearch("my_index")
            .setTypes("data")
            .setSearchType(SearchType.QUERY_AND_FETCH)
            .setQuery(QueryBuilders.rangeQuery("timestamp").gte(from).lte(to))
            .addAggregation(AggregationBuilders.terms("cat_agg").field("category").size(10))
            .setSize(0)
            .execute()
            .actionGet();

    Terms termAgg=res1.getAggregations().get("cat_agg");
    
    for(Bucket item :termAgg.getBuckets()) {    
        cat_number =item.getKey();
        System.out.println(cat_number+"  "+item.getDocCount());
        }

这是我为了在“my_index”中按“category”列获取数据而编写的查询。

运行代码后我期望的输出是:

category-1  10

category-2  9

category-3  7

但我得到的输出是:

category   10

1  10

category   9

2  9

category   7

3  7

我已经解决了一些问题,例如this one,但无法通过这些答案解决我的问题。

【问题讨论】:

    标签: java elasticsearch aggregation


    【解决方案1】:

    那是因为您的 category 字段具有默认字符串映射并且它是 analyzed,因此 category-1 被标记为两个标记,即 category1,这解释了您得到的结果。

    为了防止这种情况,您可以使用以下命令更新您的映射以包含一个子字段 category.raw,这将是 not_analyzed

    curl -XPUT localhost:9200/my_index/data/_mapping -d '{
        "properties": {
            "category": {
                "type": "string",
                "fields": {
                    "raw": {
                        "type": "string",
                        "index": "not_analyzed"
                    }
                }
            }
        }
    }'
    

    之后,您需要重新索引您的数据,并且您的聚合将起作用并返回您期望的结果。 只需确保更改 Java 代码中的以下行:

    .addAggregation(AggregationBuilders.terms("cat_agg").field("category.raw").size(10))
                                                                          ^
                                                                          |
                                                                    add .raw here
    

    【讨论】:

    • 感谢 val 的解决方案..我有一个小问题。现在由于某些原因我无法更新我的架构。那么从程序的角度来看还有其他解决方案吗?
    • 您可以创建一个全新的索引 + 映射并在其中索引您的数据。
    【解决方案2】:

    当您索引“category-1”时,您将(默认)获得两个术语,“category”和“1”。因此,当您聚合时,您将获得两个结果。

    如果您希望它被视为单个“术语”,那么您需要在索引时更改该字段上使用的分析器。设置为使用keyword analyzer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2017-05-12
      • 1970-01-01
      • 2016-08-02
      • 2020-07-21
      • 1970-01-01
      相关资源
      最近更新 更多