2012-03-28 4 views
1

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

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

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

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

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

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

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

+0

Принятый ответ не совсем правильно.Хотя RegEx не может использоваться во время поиска, его можно использовать при построении индекса. См. Мой ответ. –

ответ

2

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

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

+0

Спасибо за ваш ответ, но мне нужны атомы, а не слова: «2x2» без пробелов между ... – taofos

+0

@taofos: вот моя точка зрения: Sphinx не поддерживает функции, которые вам нужны, поэтому вам нужен другой подход, например, утилиту для перевода с регулярных выражений на расширенный язык запросов Sphinx. – outis

+0

Теперь я использую mongo с regexp вместо = = Гораздо медленнее, но это не проблема для меня ... – taofos

1

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

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

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

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

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

2

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

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

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 
+0

Отлично! Спасибо за полезное дополнение! – taofos

+0

Должен быть отмечен как правильный ответ! – dft

Смежные вопросы