使用正则表达式与狮身人面像

时间:2012-03-28 18:58:32

标签: regex sphinx character-encoding

我需要做一个允许我在sphinx中使用不确定(regexp)搜索的算法。

例如:我需要找到一个包含不确定符号的短语:“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”(这是一个很好的解决方案) X | * | - )4(X | * | - )2(|。,)2"

我可以使用“charset_table”选项来定义“*> x”,“ - > x”,“,>。”等等,但这不是灵活的决定。

你能找到更好的解决方案吗?

ps:对不起我的英语=)

3 个答案:

答案 0 :(得分:2)

据我所知,Sphinx不支持正则表达式搜索。此外,虽然extended syntax(使用-e选项启用)具有支持备选方案的运算符(“OR”运算符:|)和排序(严格顺序运算符:&lt;&lt;),但它们仅对单词而不是原子进行处理,以便2 << (x|*|-) << 4匹配字符串,其中每个元素是一个单独的单词,例如'2 x 4','2 * 4'。

一种选择是编写一个实用程序,将2(x|*|-)4(x|*|-)2(.|,)2形式的模式(或者,遵循正则表达式惯用法,2[-*x]4[-*x]2[.,]2)转换为Sphinx扩展查询。

答案 1 :(得分:2)

你确实可以在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 :(得分:1)

Sphinx对整个单词进行索引 - 并将该单词“标记”为一个整数,然后存储在索引中。因为这样的正则表达式不起作用,因为没有原始单词。

但是有dict = keywords - 它会将单词存储在索引中。但这只能用于*和?通配符,不支持正则表达式。

另外,也许可以使用这里讨论的技术 http://swtch.com/~rsc/regexp/regexp4.html

这显示了如何使用trigram索引实现通用正则表达式搜索。狮身人面像 本身可以作为三元组索引。然后将三元组存储为关键字 狮身人面像指数。 Sphinx可以运行系统输出的布尔查询。

(正常的狮身人面像,非常类似于'索引词搜索'部分文档。所以 诀窍是使用sphinx作为索引的Reg-Ex搜索的后端)