在sphinx中实现类似mysql like %var%的方法

在做了多次对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 选项中相同的技巧。




? SPH_MATCH_ALL 匹配所有查询词(默认模式)
? SPH_MATCH_ANY 匹配查询词中的任意一个
? SPH_MATCH_PHRASE 将整个查询看作一个词组,要求按顺序完整匹配
? SPH_MATCH_BOOLEAN 将查询看作一个布尔表达式

? SPH_MATCH_EXTENDED 将查询看作一个Sphinx内部查询语言的表达式

还有一个特殊的“完整扫描”模式,当如下条件满足时,该模式被自动激活:
1. 查询串是空的(即长度为零)
2. docinfo 存储方式为extern
在完整扫描模式中,佺部已索引的文档都被看作是匹配的。这类匹配仍然会被过滤、排序或分组,但是并不会做任何真正的佺文检索。这种模式可以用来统一佺文检索和非佺文检索的代码,或者减轻SQL服务器的负(有些时候Sphinx扫描的速度要优于类似的MySQL查询)。

我在使用过程中发现,如果把SetMatchMode设置成SPH_MATCH_ANY或SPH_MATCH_PHRASE,sphinx不会激活“完整扫描”,把SetMatchMode设置成SPH_MATCH_ALL、SPH_MATCH_EXTENDED、SPH_MATCH_EXTENDED2、SPH_MATCH_BOOLEAN 时能自动激活,所以完整模式的的激活条件应加上一个MatchMode条件。还有空查询关键字最好是用双引号""表示,而不是单引号''!

另外,SetMatchMode只有第一次是生效的,后面的同语法设置会失效!

如:(在调用同一个cl对象时同时存在如下的设置)

$cl = new SphinxClient();

$cl->SetMatchMode(SPH_MATCH_ANY);

$cl->SetMatchMode(SPH_MATCH_ALL);

$cl->SetMatchMode(SPH_MATCH_EXTENDED);

只有$cl->SetMatchMode(SPH_MATCH_ANY)生效,后两个无效,在执行Query时MatchMode为SPH_MATCH_ANY。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liangpz521

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值