Elasticsearch Analysis标记过滤器不捕获模式

时间:2015-06-03 04:16:05

标签: elasticsearch tokenize

我在测试索引中制作了一个自定义分析器:

PUT test
{
  "settings": {
    "analysis": {
        "filter": {
            "myFilter": {
                "type": "pattern_capture",
                "patterns": ["\\d+(,\\d+)*(\\.\\d+)?[%$€£¥]?"],
                "preserve_original": 1
            }
        },
        "analyzer": {
            "myAnalyzer": {
                "type": "custom",
                "tokenizer": "myTokenizer",
                "filters":["myFilter"]
            }
        },
        "tokenizer": {
            "myTokenizer":{
                "type":"pattern",
                "pattern":"([^\\p{N}\\p{L}%$€£¥@#'\\-&]+)|((?<=[^\\p{L}])['\\-&]|^['\\-&]|['\\-&](?=[^\\p{L}])|['\\-&]$)|((?<=[^\\p{N}])[$€£¥%]|^[$€£¥%]|(?<=[$€£¥%])(?=\\d))"
            }
        }
    }
  }
}

它应该吐出像123,234.56 $这样的数字作为单个标记 但是当提供这样的数字时,它会吐出3个令牌123 234 56 $

测试查询失败的示例:

GET test/Stam/_termvector?pretty=true 
{
    doc:{
            "Stam" : {
                "fld" : "John Doe",
                "txt": "100,234.54%"
            }
        },
        "per_field_analyzer" : {
            "Stam.txt": "myAnalyzer"
        },
        "fields" : ["Stam.txt"],
        "offsets":true,
        "positions":false,
        "payloads":false,
        "term_statistics":false,
        "field_statistics":false
    }
}

任何人都可以找出原因吗?

绝对适用于所有其他情况','和'。'是分隔符,这就是为什么我为此目的添加了一个过滤器,但遗憾的是它不起作用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

答案很简单,令牌过滤器无法通过设计组合令牌。它应该通过char过滤器完成,即使在tokenizer开始拆分为令牌之前,也会应用于char流。 我只需要确保自定义标记生成器不会拆分我的标记。