扩展语法

在sphinx的请求语法中, 有一种proximity distance的方式: 如下

"yes no"~2

在其文档中的解释为

Proximity distance is specified in words, adjusted for word count, and
applies to all words within quotes
我的理解是匹配出引号内字符之间长度在指定数值范围内的文档。 当然, 如果引号内的字符数量大于后面的数值, 那这个数值也就变得没意义了

比如上面的, yes和no之间的字符长度不能高于2,如果是三个字符

    "yes no hello"~6
    表示能匹配到的字符中包含着三个字符之间的最大长度不能超过6个。
    如果文档是中的字符为: "yes hello world you are great man no"是可以匹配到, 因为最大长度是在yes和no之间, 且长度不大于6;
    而如果文档中的字符为: "yes hello world you are great man really no"是不会被匹配到的,因为yes和no之间的长度大于6了

另一种Quorum matching operator,也是用于模糊匹配

"hello world"/0.7

前面的引号中的是要查找过滤的关键字,后面的0.7表示要匹配到的文档至少包含引号中的字符串的百分比(也可以是整数,表示要匹配到文档包含引号中的字符串的数量),比如这里的0.7,关键字是两个,所以匹配出来的文档中至少要包含1.4个引号中的字符,1.4是小数,取整应该是2个,所以要求文档中至少有两个引号中的字符。

更正: 当以百分比的形式查找符合的文档时,要符合四舍五入的原则,比如上面的0.7,如果前面的引号内是2个,则2 x 0.7 = 1.4, 四舍,即只要命中一个字符即认为匹配,如果前面有5个字符,5 x 0.7 = 3.5, 五入, 即至少要命中4个才行

假如你要查找的关键字有4个,希望查找到至少包含其中的3个字符的时候,可以用0.75~~0.87这个段的百分比

更正

Proximity distance is specified in words, adjusted for word count, and
applies to all words within quotes
这里的理解应该是匹配出引号内字符中被插入的字符数量小于指定范围的文档,即使引号内字符数量大于后面的数值也是有意义的。

比如上面的, yes和no之间的字符长度不能高于2,如果是三个字符

    "yes no hello"~6
    表示能匹配到的字符中包含着三个字符之间的最大长度小于9个,即最长距离的的两个字符(yes,no或者hello)中间,不能插入超过6个的字符。
    如果文档是中的字符为: "yes hello world you are great man no"是可以匹配到, 因为最大长度是在yes和no之间, 且被插入的字符只有5个(不包括原有字符(hello));
    而如果文档中的字符为: "yes hello world you are great man really no"是不会被匹配到的,因为yes和no之间被插入的字符长度大于等于5个了

mysql 方式

sphinx 可以像mysql一样去执行索引查询。

  1. 连接数据库

mysql -h0 -P9306

这里的-h表示的是sphinx服务所在的主机ip, 0即表示当前主机, -P(大写)表示sphinx服务的端口,这个端口是sphinx的mysql协议支持的端口,配置项seardchd, 配置行是:

listen = localhost:9306:mysql41

这样就可以像mysql一样查询数据了
例如:

select * from tags where match('@title "hello world"/0.5');

请注意: 这种方式查询结果默认只会显示20个,之后再执行

show meta;

就会显示这次查询相关的几个参数, 比如总共查找到的个数, 消耗的时间, 等等
如果想显示更多的结果, 像mysql一样 limit 就好了

我这里再说明一下上面查询中的match语法中的参数含义

@title 是期待使用title属性过滤(这个要在sphinx的索引配置中指定sql_field_string);
后面跟着的请看上面的Quorum matching operator

这个其实可以放到上面的扩展语法里,暂时写在这里


Yi_Zhi_Yu
1.9k 声望69 粉丝

PHPer,Sphinxer,Giter,Sheller,Pythoner


引用和评论

0 条评论