使用sphinx搜索子域名过程中需注意的问题
場(chǎng)景:搜索子域名
比如搜索yzswyl.cn會(huì)把www.yzswyl.cn、yzswyl.cn、host.yzswyl.cn等都搜索出來(lái)。
如果使用mysql用like的話效率是非常低的,幾百萬(wàn)甚至上千萬(wàn)的數(shù)據(jù)那是沒(méi)有辦法使用的,于是采取sphinx來(lái)做。
在使用的過(guò)程中發(fā)現(xiàn)了諸多問(wèn)題,這里將其總結(jié)起來(lái),也讓不知道的朋友注意下這些字符。
分析:
sphinx是全文索引,它搜索的是包含的記錄。
首先如果我們不做任何設(shè)置的話,搜索yzswyl.cn會(huì)出現(xiàn)把a(bǔ)ayzswyl.cn、yzswyl.a.cn、yzswyl.cn.com(當(dāng)然這個(gè)域名后綴不存在,但是會(huì)有符合相應(yīng)規(guī)則的域名,這里只舉例)等等。
為什么會(huì)出現(xiàn)這種情況呢?
我們使用./search -c 配置文件 -i 索引名 'yzswyl.cn' 搜索的時(shí)候會(huì)發(fā)現(xiàn)下面words部分被分成了兩部分'yzswyl'和'cn',默認(rèn)以.作為分隔符,如果我們不想讓它做為分隔符,就需要把.添加到charset_table里面,這里需要說(shuō)的是我們搜索域名只需要有字母、數(shù)字、"-"等字符,其他的不需要。設(shè)置如下:
charset_table = 0..9,A..Z->a..z, a..z,U+002e,U+002d,U+0040,U+0060? #其中U+002e代表".",U+002d代表"-",U+0040代表"@",U+0060代表"`",這里為ascii碼值
這樣會(huì)解決掉搜出yzswyl.a.cn這類域名。
那么yzswyl.cn.com這類呢?我們可以在索引的字段中增加惟一后綴比如“XXXXX”,concat(search,'XXXXX')這樣,就不會(huì)出來(lái)了。
現(xiàn)在就剩下aayzswyl.cn這類域名,我們使用關(guān)鍵字“ '".yzswyl.cn"' ”(注意是單引號(hào)里面套雙引號(hào))這樣來(lái)搜索,主域名單獨(dú)加上,但是使用的過(guò)程中發(fā)現(xiàn)這樣搜出了與這個(gè)域名無(wú)關(guān)的域名,比如aa.bb.cn這樣,經(jīng)后來(lái)研究是"."的問(wèn)題,后來(lái)把"."替換成"@",來(lái)搜索又出現(xiàn)12306等好多域名無(wú)法讀取到的問(wèn)題,后來(lái)經(jīng)研究估計(jì)這些特殊字符在sphinx中都有特殊的意義,于是找到了"`"這個(gè)字符,換成這個(gè)以后一切才算正常了。
注意:將"."替換成"`"等相應(yīng)字符后需在charset_table里增加這個(gè)字符,不然是被忽略的。
所以在搜索的過(guò)程中我們需要注意下這些特殊字符。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xuejie/archive/2013/01/25/2876246.html
總結(jié)
以上是生活随笔為你收集整理的使用sphinx搜索子域名过程中需注意的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 在列表中完成队列的删除和排
- 下一篇: 自定义光标