一、需求
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"' ); |