我需要做一个允许我在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:对不起我的英语=)
答案 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搜索的后端)