【问题标题】:Fail to implement pattern_capture token filter未能实现 pattern_capture 令牌过滤器
【发布时间】:2017-03-07 01:44:42
【问题描述】:

我正在尝试实现一个 Elasticsearch pattern_capture 过滤器,它可以将 EDR-00004 转换为令牌:[EDR-00004, 00004, 4]。我(仍在)使用 Elasticsearch 2.4,但文档与当前 ES 版本没有区别。

我已按照文档中的示例进行操作: https://www.elastic.co/guide/en/elasticsearch/reference/2.4/analysis-pattern-capture-tokenfilter.html

这是我的测试和结果:

curl -XPUT 'localhost:9200/test_index' -d '{
    "settings": {
        "analysis": {
            "filter": {
                "process_number_filter": {
                    "type": "pattern_capture",
                    "preserve_original": 1,
                    "patterns": [
                        "([A-Za-z]+-([0]+([0-9]+)))"
                    ]
                }
            },
            "analyzer": {
                "process_number_analyzer": {
                    "type": "custom",
                    "tokenizer": "pattern",
                    "filter": ["process_number_filter"]
                }
            }
        }
    }
}'

curl -XGET 'localhost:9200/test_index/_analyze' -d '
{
  "analyzer": "process_number_analyzer",
  "text": "EDR-00002"
}'

curl -XGET 'localhost:9200/test_index/_analyze' -d '
{
  "analyzer": "standard",
  "tokenizer": "standard",
  "filter": ["process_number_filter"],
  "text": "EDR-00002"
}'

返回:

{"acknowledged":true}

{
    "tokens": [{
        "token": "EDR",
        "start_offset": 0,
        "end_offset": 3,
        "type": "word",
        "position": 0
    }, {
        "token": "00002",
        "start_offset": 4,
        "end_offset": 9,
        "type": "word",
        "position": 1
    }]
}

{
    "tokens": [{
        "token": "edr",
        "start_offset": 0,
        "end_offset": 3,
        "type": "<ALPHANUM>",
        "position": 0
    }, {
        "token": "00002",
        "start_offset": 4,
        "end_offset": 9,
        "type": "<NUM>",
        "position": 1
    }]
}

我明白了

  1. 我不必对整个正则表达式进行分组,因为我设置了 preserve_original
  2. 我可以用 \d 和/或 \w 替换东西,但这样我就不必考虑转义了。

还要确保我的正则表达式是正确的。

>>> m = re.match(r"([A-Za-z]+-([0]+([0-9]+)))", "EDR-00004")                                                                                                                                                                                
>>> m.groups()
('EDR-00004', '00004', '4')

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我不想回答我自己的问题,但我找到了答案,也许它可以帮助将来的人。

    我的问题是默认的分词器,它会在将文本传递到我的过滤器之前对其进行拆分。通过添加我自己的标记器,它将默认拆分器 "\W+" 覆盖为 "[^\\w-]+",我的过滤器接收了整个单词,从而创建了正确的标记。

    现在这是我的自定义设置:

    curl -XPUT 'localhost:9200/test_index' -d '{
        "settings": {
            "analysis": {
                "filter": {
                    "process_number_filter": {
                        "type": "pattern_capture",
                        "preserve_original": 1,
                        "patterns": [
                            "([A-Za-z]+-([0]+([0-9]+)))"
                        ]
                    }
                },
                "tokenizer": {
                    "process_number_tokenizer": {
                        "type": "pattern",
                        "pattern": "[^\\w-]+"
                    }
                },
                "analyzer": {
                    "process_number_analyzer": {
                        "type": "custom",
                        "tokenizer": "process_number_tokenizer",
                        "filter": ["process_number_filter"]
                    }
                }
            }
        }
    }'
    

    导致以下结果:

    {
        "tokens": [
            {
                "token": "EDR-00002",
                "start_offset": 0,
                "end_offset": 9,
                "type": "word",
                "position": 0
            },
            {
                "token": "00002",
                "start_offset": 0,
                "end_offset": 9,
                "type": "word",
                "position": 0
            },
            {
                "token": "2",
                "start_offset": 0,
                "end_offset": 9,
                "type": "word",
                "position": 0
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 2015-10-02
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多