【问题标题】:How to aggregate by substring in elasticseach如何在elasticsearch中按子字符串聚合
【发布时间】:2014-06-01 10:43:51
【问题描述】:

我必须像这样索引许多文档:

POST /example/doc
{
 id : "type-name",
 foo: bar
}

我想检索所有存在的类型的列表。例如

 POST /example/doc
 {
     id : "AAA-123",
     foo: bar
 }
 POST /example/doc
 {
     id : "AAA-456",
     foo: bar
 }
 POST /example/doc
 {
     id : "BBB-123",
     foo: bar
 }

并要求 elasticseaarch 给我一份我拥有 AAA 和 BBB 的列表。

更新 我也使用自定义分析器解决了

"settings": { 
        "analysis": {
            "char_filter" : {
                "remove_after_minus":{
                    "type":"pattern_replace",
                    "pattern":"-(.*)",
                    "replacement":""
                }
            },
            "analyzer": {
                "id_analyzer":{
                     "tokenizer" : "standard",
                    "char_filter" : ["remove_after_minus"]
                }
            }
        }
    }

【问题讨论】:

  • 如何在 aggs 查询中使用这个分词器?

标签: elasticsearch aggregation


【解决方案1】:

如果您保留标准分析器,则 id 将在“-”处拆分。因此,如果您的类型小写和大写相同,则可以使用简单的方面查询

curl -XPOST  "http://localhost:9023/index/type/_search?size=0&pretty=true" -d
'{
    "query" : {
        { "regexp":{ "id": "[A-Z]+" }
    },
   "facets" : {
       "id" : {
           "terms" : {
               "field" : "id",
               "size" : 50
            }
        }
    }
}'

应该给你一些你可以使用的东西。

【讨论】:

  • 有效!如果“类型”和“名称”有数字和字母,我应该改变什么,我只想要“类型”部分
  • 只是正则表达式部分:而不是 [A-Z]+,\w+
  • 我试过这样,但现在我也得到了名称部分。我应该实现自定义分析器还是有更简单的解决方案?
猜你喜欢
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2022-12-12
  • 2020-02-01
相关资源
最近更新 更多