【问题标题】:Word boundary in Lucene regexLucene 正则表达式中的单词边界
【发布时间】:2018-07-09 03:04:33
【问题描述】:

我想在 Elastisearch 中使用 word boundaries 进行正则表达式查询,但看起来 Lucene regex engine 不支持 \b。我可以使用哪些解决方法?

【问题讨论】:

  • 您是否也希望返回 4 text word and wordb 字符串(如果您要查找的是 word)?
  • 不,只是word
  • 如果您使用分词器,您可以使用 Java 正则表达式。然后支持\b。见docs
  • 在我看来,您可能会在使用 ES Lucene 正则表达式风格的查询中使用类似 ~([A-Za-z0-9_]word|word[A-Za-z0-9_])word~([A-Za-z0-9_]word|word[A-Za-z0-9_]) 的东西,匹配一个不包含 words 且两端带有单词字符的字符串,a词,以及任何文本,但 word 是词的一部分。
  • 三思而后行,试试(.*[^A-Za-z0-9_])?word([^A-Za-z0-9_].*)?

标签: regex elasticsearch lucene


【解决方案1】:

在 ElasticSearch 正则表达式风格中,没有直接等同于单词边界。如果word 以字符开头,则初始\b 类似于(^|[^A-Za-z0-9_]),如果word 以字符结尾,则结尾\b 类似于($|[^A-Za-z0-9_])

因此,我们需要确保在word 或字符串的开头/结尾之前和之后有一个非单词字符。由于正则表达式是默认锚定的,所以我们需要在字符串的开头/结尾使[^A-Za-z0-9_] 成为可选的,只需在旁边添加.* 并使用可选的分组构造进行包装:

(.*[^A-Za-z0-9_])?word([^A-Za-z0-9_].*)?

详情

  • (.*[^A-Za-z0-9_])? - 字符串开头或任何 0+ 字符(但换行符,否则使用 (.|\n)*),然后是除单词字符之外的任何字符(基本上,它是字符串开头,后跟 1 或 0 次出现组内的模式)
  • word - 一句话
  • ([^A-Za-z0-9_].*)? - 任何字符的可选序列,但一个单词 char 后跟任何 0+ 字符,后跟字符串位置的结尾(在 Lucene 正则表达式中隐含)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2011-04-14
    • 2011-03-28
    • 2012-09-24
    相关资源
    最近更新 更多