Elasticsearch:索引字符串

时间:2017-06-26 14:51:27

标签: elasticsearch aggregation mappings

我正在使用5.3版本。

我有一个文字字段a。我想聚合a的第一个字符。我还需要整个原始值。

我认为最有效的方法是使用自定义规范化器设置关键字字段a.firstLetter。我试图通过模式替换char过滤器实现这一点,但我正在努力使用正则表达式。

我完全错了吗?你能救我吗?

修改

这就是我尝试过的。

settings.json

{
  "settings":  {
    "index": {
      "analysis": {
        "char_filter": {
          "first_char": {
            "type": "pattern_replace",
            "pattern": "(?<=^.)(.*)",
            "replacement": ""
          }
        }
        "normalizer": {
          "first_letter": {
            "type": "custom",
            "char_filter": ["first_char"]
            "filter": ["lowercase"]
          }
        }
      }
    }
  }
}

mappings.json

{
  "properties": {
    "a": {
      "type": "text",
      "index_options": "positions",
      "fields": {
        "firstLetter": {
          "type": "keyword",
          "normalizer": "first_letter"
        }
      }
    }
  }
}

当我尝试聚合时,我没有得到任何桶:

"aggregations": {
  "grouping": {
    "terms": {
      "field": "a.firstLetter"
    }
  }
}

所以基本上我的方法是“用空字符串替换除第一个char之外的所有字符。”正则表达式是我能够通过谷歌搜索收集的。

编辑2 我错误配置了规范化器(我修复了这些例子)。正确的配置显示,由于issue 23142,规范化器不支持模式替换字符过滤器。显然,对它的支持将在5.4版本中最早实现。

还有其他选择吗?我不想在代码中执行此操作,方法是在第一个字母的doc中添加一个字段,因为我正在为其他所有聚合使用Elasticsearch功能。

1 个答案:

答案 0 :(得分:1)

您可以使用长度为1的truncate过滤器

PUT foo
{
  "mappings": {
    "bar" : {
      "properties": {
        "name" : {
          "type": "text",
          "analyzer": "my_analyzer"
        }
      }
    }
  }, 
  "settings":  {
    "index": {
      "analysis": {
        "analyzer" : {
          "my_analyzer" : {
            "type" : "custom",
            "tokenizer" : "keyword",
            "filter" : [ "my_filter", "lowercase" ]
          }
        },
        "filter": {
          "my_filter": {
            "type": "truncate",
            "length": 1
          }
        }
      }
    }
  }
}

GET foo/_analyze
{
  "field" : "name",
  "text" : "New York"
}

# response
{
  "tokens": [
    {
      "token": "n",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    }
  ]
}