Использование регулярных выражений со сфинксом - PullRequest
1 голос
/ 28 марта 2012

Мне нужно создать алгоритм, который позволит мне использовать неопределенный (регулярное выражение) поиск в сфинксе.

Например: мне нужно найти фразу, которая содержит неопределенные символы: «2x4» может выглядеть как «2x4» или «2 * 4» или «2-4».

Я хочу сделать что-то вроде этого: «2 (x | * | -) 4». Но если я попытаюсь использовать эту конструкцию в запросе, sphinx разделит ее на три слова: «2», «(x | * | -)» и «4»:

$ search -p "2x4"
...
index 'xxx': query '2x4 ': returned 25 matches of 25 total in 0.000 sec
...
words:
1. '2x4': 25 documents, 25 hits


$ search -p "2(x|y)4"
...
index 'xxx': query '2(x|y)4 ': returned 0 matches of 0 total in 0.000 sec

words:
1. '2': 816 documents, 842 hits
2. 'x': 21 documents, 21 hits
3. 'y': 0 documents, 0 hits
4. '4': 2953 documents, 3014 hits

Как уродливый хак, я могу сделать что-то вроде (2x4) | (2 * 4) | (2-4), но это не очень хорошее решение, если я получу большую фразу, например "2x4x2.2", и мне нужно "2 ( х | * | -) 4 (х | * | -) 2 (|..,) 2"

Я могу использовать опцию "charset_table", чтобы определить "*> x", "-> x", ",>." и так далее, но это не гибкое решение.

Можете ли вы найти лучшее решение?

ps: простите за мой английский =)

Ответы [ 3 ]

2 голосов
/ 09 декабря 2013

Вы действительно можете использовать регулярные выражения со Sphinx.

Хотя их нельзя использовать во время поиска, их можно использовать при создании индекса, чтобы идентифицировать группу слов / символов, которые следует рассматривать как один и тот же токен.

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

# index '13-inch' as '13inch'
regexp_filter = \b(\d+)\" => \1inch

# index 'blue' or 'red' as 'color'
regexp_filter = (blue|red) => color
2 голосов
/ 29 марта 2012

Из того, что я прочитал, Sphinx не поддерживает поиск регулярных выражений.Более того, хотя расширенный синтаксис (включается с опцией -e) имеет операторы, которые поддерживают альтернативы (оператор «ИЛИ»: |) и последовательность (оператор строгого порядка: <<), они работают толькона словах, а не на атомах, так что <code>2 << (x|*|-) << 4 будет соответствовать строкам, где каждый элемент является отдельным словом, таким как '2 x 4', '2 * 4'.

Один из вариантов - написать утилиту, котораяпреобразует шаблон вида 2(x|*|-)4(x|*|-)2(.|,)2 (или, следуя идиоме регулярного выражения, 2[-*x]4[-*x]2[.,]2) в расширенный запрос Sphinx.

1 голос
/ 29 марта 2012

Сфинкс индексирует целые слова и «токенизирует» слово в целое число, которое затем сохраняется в индексе. Как таковые регулярные выражения не могут работать, потому что не имеют оригинальных слов.

Однако есть dict = Keywords - который сохраняет слова в индексе. Но это можно только сейчас использовать для * и? подстановочные знаки, не поддерживает регулярные выражения.

Также, возможно, могли бы использовать методы, обсужденные здесь http://swtch.com/~rsc/regexp/regexp4.html

Это показывает, как поиск по регулярному выражению может быть реализован с помощью индекса триграммы. сфинкс сам по себе будет работать в качестве индекса триграммы. Вы сохраняете триграммы как ключевые слова, которые затем индексы сфинкса. Sphinx может выполнять логические запросы, которые выводит система.

(обычный сфинкс, работает почти так же, как документы раздела «Поиск по индексу»). хитрость заключается в использовании sphinx в качестве бэкенда для индексированного поиска Reg-Ex)

...