【问题标题】:Remove Open and Close Parentheses from Sphinx Index从 Sphinx 索引中删除左括号和右括号
【发布时间】:2018-05-06 21:00:17
【问题描述】:

我有一个regexp_filter,它在我的文档中寻找一个模式,例如..g

regexp_filter=Bob Smith=>Robert Smith

但是我发现当模式文本在括号内时这不起作用,例如..

he and my boss (Bob Smith) were due to..

我已经尝试了一些方法来摆脱(

  1. 在停用词中添加了(
  2. 添加了一个不包含括号的自定义字符集

但无论模式在括号内时都不匹配。

有没有办法正确地做到这一点?

更新是连字符也会发生完全相同的事情。即使我在 StopwordsCharset 中明确删除它们,甚至制作一个正则表达式来删除它们

regexp_filter=-=>

它们被编入索引并破坏任何正则表达式,尤其是单词边界。

所以:

regepx_filter=\bBob\b=>Robert

在“收件人:Bob-Mark-John”之类的文本中失败

`

【问题讨论】:

  • 确保源代码中没有额外的换行符(即换行),例如,如果 Bob 和 Smith 之间有换行符,则正则表达式不会匹配它。 (regexp_filter 应用于原始传入文本,而不是在根据 charset_table 标准化(标记化)之后。

标签: sphinx


【解决方案1】:

如果您在 charset_table 中添加括号(意味着它是一个有效的字符,就像 'a' 一样),意味着 (Bob Smith) 变为 (Robert Smith)。 “Robert Smith”将不匹配“(Robert Smith)”。仅当您启用中缀并进行通配符搜索(如“*Robert Smith*”)时,才能进行此匹配。

只有当您确定需要将特殊字符作为用于构造单词的有效字符时,您才应该向 chartset_table 添加特殊字符。

【讨论】:

  • 是的,刚刚发现。问题是无论我对连字符做什么,它都不会充当单词分隔符。我尝试将其作为ignore_chars,但发现当连字符在char_set中not时,这会将'abc-def'变成'abcdef'而不是'abc def'。但是很明显,即使 a) 不在 char_set b) 不在 ignore_char 中,它们的连字符也不能作为单词分隔符。
  • ignore_chars 取出字符 - 这意味着忽略的字符变为“无效”,因此它之前和之后的字符被粘合(!)。 ignore_chars 不是单词分隔符。单词分隔符是任何未声明的字符。如果您在搜索字符串中使用连字符 - 尝试转义它(因为连字符是语法运算符)。你在 SHOW META 中得到了什么?
猜你喜欢
  • 2017-04-20
  • 2019-10-12
  • 1970-01-01
  • 2019-02-03
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2017-07-05
相关资源
最近更新 更多