Я делаю примерно так:

  • Замена акронимов верхнего регистра, которые также являются словами (например, HI = Hawaii), акронимами upper_ $ для будущего поиска.
  • Это делается при совпадении с образцом.

Так, например, для HI выше я бы сделал:

regexp_filter = (HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_\1\2

Я использовал \ 2, потому что согласно

https://regex101.com/r/uZ4zK1/1

Вторая группа захвата дает мне необходимое пространство, поэтому термин (теоретически) становится

upper_HI Manufacturing

Моя проблема в том, что где-то в процессе "HI" распознается ТОЛЬКО как "Hi".

Любое из следующего соответствует проиндексированной записи:

select  Name from idx_Test WHERE (MATCH('"upper_Hi Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_Hi" "Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_Hi"'))

Все делают следующее не удается:

select  Name from idx_Test WHERE (MATCH('"upper_HI Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_HI" "Manufacturing"'))
select  Name from idx_Test WHERE (MATCH('"upper_HI"'))

Даже если я явно принудительно введу "HI":

regexp_filter = (HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_HI\2

Я получаю ту же ошибку.

0
user3649739 27 Дек 2015 в 03:50

2 ответа

Лучший ответ

Помните, что regex_filter также применяется к запросу .

Так что вам следует искать

select Name from idx_Test WHERE MATCH('"HI Manufacturing"')

Вам не нужно применять преобразование самостоятельно. Фактически, в вашем примере он будет применен «дважды», один раз вами, один раз сфинксом, превратив его в MATCH('"upper_upper_hi manufacturing"'), поэтому он не совпадает.

Смешанный регистр «Hi» работает, потому что фильтр регулярных выражений НЕ срабатывает. Помните, что в регулярных выражениях учитывается регистр.

Он по-прежнему совпадает, потому что charset_table не учитывает регистр.

0
barryhunter 27 Дек 2015 в 10:05

Если вы хотите сопоставить (HI | Hi | hi), вы можете либо явно определить каждый, либо еще лучше добавить флаг для запуска сопоставления без учета регистра: (?i)

regexp_filter = (?i)(HI)(\W+(?:\w+\W+){0,3}?(Manufacturing)\b) => upper_\1\2
0
cynicaljoy 27 Дек 2015 в 15:24