2015-11-19 6 views
1

Я знаю настройку charset_table, чтобы разрешить U+00E9 -> e, который отобразит 'é' в 'e'. Однако если вместо U + 00E9 у вас есть U + 0065 U + 0301 (который является «разложенной» формой «é», которая является просто «e», за которой следует острый акцент), то Sphinx будет рассматривать U + 0301 как пробел и сломайте слово.Может ли Sphinx обрабатывать формы нормализации Unicode?

пример:

mysql> CALL KEYWORDS('Crème brûlée', 'recipes_rt', 1); 
+------+-----------+------------+------+------+ 
| qpos | tokenized | normalized | docs | hits | 
+------+-----------+------------+------+------+ 
| 1 | creme  | creme  | 3 | 3 | 
| 2 | brulee | brulee  | 2 | 2 | 
+------+-----------+------------+------+------+ 
2 rows in set (0.00 sec) 

mysql> CALL KEYWORDS('Crème brûlée', 'recipes_rt', 1); 
+------+-----------+------------+------+------+ 
| qpos | tokenized | normalized | docs | hits | 
+------+-----------+------------+------+------+ 
| 1 | creme  | creme  | 3 | 3 | 
| 2 | brule  | brule  | 0 | 0 | 
| 3 | e   | e   | 3 | 3 | 
+------+-----------+------------+------+------+ 
3 rows in set (0.15 sec) 

Что-то вроде нормализации NFKC Unicode здесь нужно, но я не вижу ни одного упоминания о том, что в документации.

ответ

1

Не знаете, как обращаться с ним «масштабируемо» (т.е. все формы), но, возможно, людей можно было бы сделать с помощью regexp_filter?

http://sphinxsearch.com/docs/current/conf-regexp-filter.html

regexp_filter = \%u0065\%u0301 => e 

Хотя, говорит, что, возможно, просто добавьте U + 0301 (и другие 'combining' символов) в ignore_chars? http://sphinxsearch.com/docs/current/conf-ignore-chars.html

Они исчезают оставляя за «этого нужно просто» обугленные без акцента (е)

+0

Поскольку я делаю 'E -> é' затем я добавил' ignore_chars' для обработки сочетающих символов. Однако я не уверен, какой диапазон является «полным» набором для обработки всех случаев. Я также делал комбинированные диакритические знаки ('ignore_chars = U + 0300..U + 036F'), как вы упомянули, но не уверен, что все сделано. –

+0

fwiw выражение 'regexp_filter' в этом ответе не работало для меня, я должен был использовать это:' regexp_filter = \ x {0065} \ x {0301} => e'. Я думаю, это потому, что я использовал более позднюю версию google re2? https://github.com/google/re2/wiki/Syntax – joshweir