在pattern_replace中不区分大小写的替换

时间:2013-11-14 09:46:39

标签: lucene elasticsearch

我有pattern_replace令牌过滤器(es docs

'addressPattern' => array(
                'type' => 'pattern_replace',
                'pattern' => '(str\.|street|and many more like this)',
                'replacement' => '',
            ),

如何使匹配不区分大小写?

2 个答案:

答案 0 :(得分:5)

很抱歉,这个答案不及时,但我正在寻找在Elasticsearch中执行不区分大小写的模式匹配的问题。一种方法是使用嵌入式标志:

'pattern' => '(?i)(str\.|street|and many more like this)',

嵌入式标志使用(?xyz)语法,其中xyz是标志。其他标志是'u'用于unicode情况,'m'用于多行,'s'用于dotall,以及更多。通常我和s是最有用的标志,如果使用非英语单词,你也可以使用它。请注意,嵌入式标志是上下文的 - 如果您将其放在组的开头,它仅适用于该组。

Lucene使用Java的标准库正则表达式,因此有关更多详细信息,请参阅java docs for util.regex.Patterntutorial on java regex patterns

答案 1 :(得分:1)

您可以在lowercase filter中加入analyzer。例如:

settings: {
  analysis: {
    tokenizer: {pattern_tokenizer: {... define your tokenizer here }}
    analyzer: {
      tokenizer: 'pattern_tokenizer',
      filter: ['lowercase'], 
      ....other details...

    }
  }
}

重点是在分析仪中定义lowercase过滤器。

如果您使用term查询来匹配搜索,则需要将搜索字词转换为小写,然后应用查询。