Elasticsearch奇怪的过滤行为

时间:2015-07-29 15:22:56

标签: elasticsearch

我正在尝试替换字段中的特定字符串。所以我使用了自定义分析器和字符过滤器,就像它在the docs中描述的那样,但它不起作用。
  以下是我的索引设置:

{
    "settings": {
        "analysis": {
            "char_filter": {
                "doule_colon_to_space": {
                    "type":       "mapping",
                    "mappings": [ "::=> "]
            }},
            "analyzer": {
                "my_analyzer": {
                    "type":         "custom",
                    "char_filter":  [ "doule_colon_to_space" ],
                    "tokenizer":    "standard"
            }}
}}}

应该用空格替换所有双冒号(::)。我然后更新我的映射以使用分析器:

{
    "posts": {
        "properties": {
          "id": {
            "type": "long"
          },
          "title": {
            "type": "string", 
            "analyzer": "my_analyzer",
            "fields": {
                "simple": {
                    "type": "string", 
                    "index": "not_analyzed"
                }
            }
          }
        }
      }
}

然后我在索引中放了一个文件:

{
    "id": 1, 
    "title": "Person::Bruce Wayne"
}

然后我测试分析器是否工作,但它似乎不是 - 当我发送这个https://localhost:/first_test/_analyze?analyzer=my_analyzer&text=Person::Someone+Close时,我得到了两个令牌 - 'PersonSomeone'(一起)和'Close'。我这样做了吗?可能是我应该以某种方式逃离这个空间?我使用Elasticsearch 1.3.4

1 个答案:

答案 0 :(得分:1)

我认为char_filter模式中的空格被忽略了。请尝试将unicode转义序列用于单个空格:

"mappings": [ "::=>\\u0020"]

<强>更新

在回复您的评论时,简短回答是是,示例错误。文档建议您可以使用映射字符过滤器将标记替换为由空格填充的另一个标记,但the code不同意。

MappingCharFilterFactory的源代码使用此正则表达式来解析设置:

// source => target
private static Pattern rulePattern = Pattern.compile("(.*)\\s*=>\\s*(.*)\\s*$");

此正则表达式匹配(并有效地丢弃)第二个替换标记(\\s*)周围的任何空格((.*)),因此您似乎不能使用前导或尾随空格作为替换映射的一部分(虽然它可能包括插页式空格)。即使正则表达式不同,匹配的标记也是trim(),这将删除任何前导和尾随空格。