用于在弹性搜索中拆分字符串的映射分析器

时间:2016-09-01 10:34:00

标签: elasticsearch elasticsearch-mapping

是否可以创建一个映射分析器,根据字符数将字符串拆分成更小的部分?

例如,假设我有一个字符串:“ABCD1E2F34”。这是一些由多个较小的代码构成的令牌,我想再次将其分解为这些代码。

如果我确定知道: - 第一个代码总是4个字母(“ABCD”) - 第二个是3个字母(“1E2”) - 第三个是1个字母(“F”) - 第四个是2个字母(“34”)

我是否可以为将要映射字符串的字段创建映射分析器?如果我将字段“bigCode”设置为值“ABCD1E2F34”,我将能够像这样访问它:

bigCode.full ("ABCD1E2F34")
bigCode.first ("ABCD")
bigCode.second ("1E2")
... 

非常感谢!

1 个答案:

答案 0 :(得分:0)

您如何看待Pattern tokenizer?我创建了一个正则表达式,将字符串拆分为令牌(?<=(^\\w{4}))|(?<=^\\w{4}(\\w{3}))|(?<=^\\w{4}\\w{3}(\\w{1}))|(?<=^\\w{4}\\w{3}\\w{1}(\\w{2}))。之后我创建了一个类似的分析器:

PUT /myindex
{
    "settings": {
        "analysis": {
          "analyzer": {
            "codeanalyzer": {
              "type": "pattern",
              "pattern":"(?<=(^\\w{4}))|(?<=^\\w{4}(\\w{3}))|(?<=^\\w{4}\\w{3}(\\w{1}))|(?<=^\\w{4}\\w{3}\\w{1}(\\w{2}))"
            }
          }
        }
    }
}

POST /myindex/_analyze?analyzer=codeanalyzer&text=ABCD1E2F34

结果是标记化数据:

{
  "tokens": [
    {
      "token": "abcd",
      "start_offset": 0,
      "end_offset": 4,
      "type": "word",
      "position": 0
    },
    {
      "token": "1e2",
      "start_offset": 4,
      "end_offset": 7,
      "type": "word",
      "position": 1
    },
    {
      "token": "f",
      "start_offset": 7,
      "end_offset": 8,
      "type": "word",
      "position": 2
    },
    {
      "token": "34",
      "start_offset": 8,
      "end_offset": 10,
      "type": "word",
      "position": 3
    }
  ]
}

您也可以查看文档:{​​{3}}