在做了多次对sphinx各种情况的检索下。发现我们可以充分利用sphinx实现很多功能。比如替换 mysql的like
。而不需要全文检索功能
在sphinx中,默认设置是对单词(英语)进行特定字符(如:/,空格等)做分割的全文检索功能。所以,如果我们要在文章中(textfield)检索某个特定的字词,只能针对
某个单词进行检索。比如 搜索test,出现的只能是 单个单词 test。如果要实现 搜索 tes
,则不会出现匹配test的项目。如果要实现这样的情况。我们可以针对
单个字(字母)进行索引。这个在中文检索中特别重要。因为中文不是根据特殊字符界定的。
在sphinx中文包 coreseek中已经对这个包进行了分割。但现在我们需要的是单个实现类似mysql like功能。
例如:
我是中华人民共和国公民
我需要检索“是中”,在coreseek中文包中是没有对这个进行分词索引。所以有时候会检索不到。那么我们这时候可以不使用中文全文检索。单独使用utf-8作为字符编码不使用coreseek的字典文件。同时对索引中缀长度设置为
1 。并设置utf-8的charset-table即可实现like 功能!
附:sphinx中文手册中中缀索引
8.2.14. min_prefix_len
索引的最小前缀长度。可选选项,默认为0(不索引前缀)。
前缀索引使实现“wordstart*”形式的通配符成为可能(通配符语法的细节请参考enable_star
选项)。当最小前缀长度被设置为正值,indexer除了关键字本身还会索引所有可能的前缀
(即词的开头部分)。太短的前缀(小于允许的最小值)不会被索引。
例如,在min_prefix_len=3设置下索引关键字“example”会导致产生5个索引项“exa”,
“exam”, “examp”, “exampl”和该词本身。对这个索引搜索“exam”会得到包含“example”的文
档,即使该文档中没有“exam”自身。然而,前缀索引会使索引体积急剧增大(因为待索引
关键字增多了很多),而且索引和搜索的时间皆会恶化。
在前缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但有一些技巧
可以实现这个功能。首先,可以建立两个索引,一个带有前缀索引,另一个没有,同时在这
两个索引中搜索,然后用SetIndexWeights() 来设置二者的权重。其次,可以启用星号语法并
重写扩展模式的查询。
# in sphinx.conf
enable_star = 1
// in query
$cl->Query ( “( keyword | keyword* ) other keywords” );
示例:
min_prefix_len = 3
8.2.15. min_infix_len
索引的最小中缀长度。可选选项,默认为0(不索引中缀)。
中缀索引是实现“start*”, “*end”, and “*middle*”等形式的通配符成为可能(通配符语法的细
节请参考enable_star 选项)。当最小中缀长度设置为正值,indexer除了对关键字本身还会
对所有可能的中缀(即子字符串)做索引。太短的中缀(短于允许的最小长度)不会被索引。
例如,在min_infix_len=2设置下索引关键字“test”会导致产生6个索引项 “te”, “es”, “st”,
“tes”, “est”等中缀和词本身。对此索引搜索“es”会得到包含“test”的文档,即使它并不包含
“es”本身。然而,中缀索引会使索引体积急剧增大(因为待索引关键字增多了很多),而
且索引和搜索的时间皆会恶化。
在中缀索引中没有自动的办法可以提高精确匹配(整个词完全匹配)的评分,但可以使用与
prefix indexes 选项中相同的技巧。