sphinx实现模糊查询

一、需求

1.假设能做网有两个子域名:blog.nengzuo.com, www.nengzuo.com,  我需要在搜索.nengzuo.com时,能把包含两个子域名和自己的都搜出来。

2.因为量比较大(亿级),所以要求尽量使索引速度最快,占用资源最少。

二、思路

A.首先,因为域名中含有字符'-'和'.',所以需要在charset_table中把这俩字符加进去。

1
2
     charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\
A..Z->a..z, a..z,U+002e,U+002d

其次,如果想实现模糊查询,需要将中辍值设为>0,并且不能指定infix_field。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
     morphology = none
     # 索引词最小长度
     min_word_len = 0
     #enable_star = 1
     #prefix_fields = domain
     #infix_fields = domain
     #ignore_chars = -  
     # 数据编码(设置成utf8才能索引中文)
     charset_type = utf-8
     charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\
A..Z->a..z, a..z,U+002e,U+002d
     # 最小索引前缀长度
     min_prefix_len = 0
     # 最小索引中缀长度
     min_infix_len = 1
     # 对于非字母型数据的长度切割(for CJK indexing)
     ngram_len = 1
     # 对否对去除用户输入查询内容的html标签
     html_strip = 0

min_infix_len的值可以设置大一点,但无论怎样配置,消耗的资源(包括时间和空间)都是几十倍的增涨。实在令人难以承受。


B.不用中辍,不用charset_table,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
index page_fact1
{
     # 索引源声明
     source  = src_page_fact1
     #source = src_page_fact2
     #source = src_page_fact3
  
     # 索引文件的存放位置
     path =  /data/sphinx-chinese/data_search_1/page_fact1
     # 文件存储模式(默认为extern)
     docinfo = extern
     # 缓存数据内存锁定
     mlock = 0
     # 马氏形态学(对中文无效)
     morphology = none
     # 索引词最小长度
     min_word_len = 0
     enable_star = 1
     #prefix_fields = domain
     #ignore_chars = -  
     # 数据编码(设置成utf8才能索引中文)
     charset_type = utf-8
     # 最小索引前缀长度
     min_prefix_len = 0
     # 最小索引中缀长度
     min_infix_len = 0
     # 对于非字母型数据的长度切割(for CJK indexing)
     ngram_len = 1
     # 对否对去除用户输入查询内容的html标签
     html_strip = 0
}

最关键的地方是要在查询的时候的要以句子表达式来约束主域名,即把原来查询条件用引号括起来:


1
mysql>  select  * from page_fact1 where match( '".nengzuo.com"' );

你可能感兴趣的:(sphinx)