将regexp与sphinx一起使用
我需要做一个算法,允许我在sphinx中使用不确定(regexp)搜索 例如:我需要找到一个包含不确定符号的短语:“2x4”可能看起来像“2x4”或“2*4”或“2-4” 我想这样做:“2(x*)-4”。但如果我试图在查询中使用这个结构,斯芬克斯将其拆分为三个词:“2”,“x*”(x-)和“4”: 像《丑恶黑客》一样,我会做一些类似(2x4)|(2*4)|(2-4)的事情,但如果我得到一个像“2x4x2.2”这样的大短语,并且需要“2(x*)-4(x*)-2(.|,)2”,这不是一个好的解决方案 我可以使用“charset_table”选项来定义“*>x”、“->x”、“,>”等等,但这不是一个灵活的决定 你能找到更好的解决办法吗将regexp与sphinx一起使用,regex,sphinx,character-encoding,Regex,Sphinx,Character Encoding,我需要做一个算法,允许我在sphinx中使用不确定(regexp)搜索 例如:我需要找到一个包含不确定符号的短语:“2x4”可能看起来像“2x4”或“2*4”或“2-4” 我想这样做:“2(x*)-4”。但如果我试图在查询中使用这个结构,斯芬克斯将其拆分为三个词:“2”,“x*”(x-)和“4”: 像《丑恶黑客》一样,我会做一些类似(2x4)|(2*4)|(2-4)的事情,但如果我得到一个像“2x4x2.2”这样的大短语,并且需要“2(x*)-4(x*)-2(.|,)2”,这不是一个好的解决方案
ps:对不起,我的英语=)据我所知,Sphinx不支持正则表达式搜索。此外,虽然(通过
-e
选项启用)有支持备选方案的运算符(“OR”运算符:|)和排序运算符(“严格顺序运算符:”),但Sphinx不支持正则表达式搜索。此外,(通过-e
选项启用)有支持备选方案的运算符(“OR”)运算符:|)和排序(严格顺序运算符:Sphinx为整个单词编制索引,并将单词“标记”为整数,然后存储在索引中。因此,正则表达式无法工作,因为没有原始单词
然而,还有dict=keywords,它将单词存储在索引中。但是它现在只能用于*和?通配符,不支持正则表达式
此外,也许可以使用这里讨论的技术
这显示了如何使用trigram索引实现通用正则表达式搜索
它本身将用作三叉树索引。您将三叉树存储为关键字,然后
sphinx可以运行系统输出的布尔查询
(普通的斯芬克斯,其工作原理与“索引词搜索”部分的文档非常相似
技巧是使用sphinx作为索引Reg Ex搜索的后端)sphinx为整个单词编制索引,并将单词“标记”为整数,然后存储在索引中。因为没有原始单词,所以这种正则表达式无法工作 然而,还有dict=keywords,它将单词存储在索引中。但是它现在只能用于*和?通配符,不支持正则表达式 此外,也许可以使用这里讨论的技术 这显示了如何使用trigram索引实现通用正则表达式搜索 它本身将用作三叉树索引。您将三叉树存储为关键字,然后 sphinx可以运行系统输出的布尔查询 (普通的斯芬克斯,其工作原理与“索引词搜索”部分的文档非常相似
技巧是使用sphinx作为索引Reg Ex搜索的后端)您确实可以将正则表达式与sphinx一起使用 虽然不能在搜索时使用它们,但可以在构建索引时使用它们来标识应视为相同标记的一组单词/符号
您确实可以将正则表达式与Sphinx一起使用 虽然不能在搜索时使用它们,但可以在构建索引时使用它们来标识应视为相同标记的一组单词/符号
谢谢你的回答,但我需要的不是单词:“2x2”之间没有空格…@taofos:这是我的观点:Sphinx不支持你需要的功能,所以你需要一种不同的方法,比如一个实用工具来将正则表达式转换成Sphinx的扩展查询语言。现在我使用mongo和regexp=)慢多了,但这对我来说不是问题…谢谢你的回答,但我需要的不是文字:“2x2”没有空格…@taofos:这是我的观点:Sphinx不支持您需要的功能,所以您需要一种不同的方法,例如一个实用程序来将正则表达式转换为Sphinx的扩展查询语言。现在我使用mongo和regexp=)速度要慢得多,但这对我来说不是问题……公认的答案并不完全正确。虽然RegEx不能在搜索时使用,但它可以在构建索引时使用。请看我的答案。公认的答案并不完全正确。虽然RegEx不能在搜索时使用,但它可以在构建索引时使用。看我的答案,太好了!谢谢你的有益补充!伟大的谢谢你的有益补充!
$ 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
# index '13-inch' as '13inch'
regexp_filter = \b(\d+)\" => \1inch
# index 'blue' or 'red' as 'color'
regexp_filter = (blue|red) => color