sphinx实现模糊查询

一、需求

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

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

二、思路

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

    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。

    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,配置如下:

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
}

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


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



发表评论

电子邮件地址不会被公开。 必填项已用 * 标注


*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>