当前位置: 首页 > 工具软件 > PHP Sphinx > 使用案例 >

sphinx mysql连表查询_php sphinx 搜索 多表联查速度怎么样?

姚阳德
2023-12-01

使用Elasticsearch和solr一样,使用lucene

这个和php无关,因为无论哪个工具,都是通过网络接口查询,所以我不回答有关是否适合php的情况~~

## ES 缺点

基于java,会有一些java的常见问题需要注意,比如gc

单纯执行速度上比C写的sphinx慢

## sphinx 优点

纯粹,没有什么花哨的其他功能

C写的,速度快

新版本加了分布式、动态更新索引等功能

## 下面列举Es比sphinx优秀的部分

1、部署简单,虽然sphinx部署也挺简单,但是在书写配置的时候,你会发现,sphinx的配置是要写好后,重启sphinx,而Elasticsearch针对某个索引的配置,是可以动态写入的。

2、调试简单,sphinx有命令行工具可以调试,而Elasticsearch使用的是http接口进行调试,不需要专门的API类,几行php代码就可以写一个Elasticsearch的API。

3、可视化工具比较多,有收费的,也有的,比如kibana head marvel。

4、提供结构化的JSON查询语句,易读性强

5、Es可以保留源数据(可选),也就是说,你可以不需要mysql的支持,就可以完成整个搜索过程,即使你不需要这个功能,在调试的时候,还是让人感到非常便利,不用将查询结果到数据库匹配一下。

6、Es可以动态更新全文索引,动态更新单个记录,而不像sphinx一样需要重建全部

7、对UTF8的支持是不需要单独配置的

## 从中文分词上来说

首先我觉得分词最重要的基本都是词库,分词算法两个工具基本都可以使用。

lucene 支持很多分词工具,比如

word

比如ik

这两个工具最近都很活跃,因为Es更新2.0 和 2.1

比较分词区别(sphinx可能有误):

sphinx分词 我不太熟悉它的机制,多数情况下我使用scws分词,发送给sphinx,然后设置匹配规则,比如最大匹配(我基本都是基于模糊匹配在用sphinx)

Es的全文索引是基于分词的,也就是事先分好词,每个词对应某些记录,自动进行TF/IDF的运算,得到一个评分后返回,当然这个评分可以改(sphinx同样支持修改评分),这种检索方式肯定更快,但是受到分词限制,所以我每个字也分词,然而这样可能影响分数判断。

另一方面ES也支持类似sphinx的匹配方式,叫做fuzzy,模糊匹配,一般会一起使用,一个词不在分词库中的时候,就用fuzzy,所以Es在功能上,应该和sphinx不会有太多差别,而且应该要更多。

## 个人方面

我在使用shpinx的时候,会查3次,一次完全按照用户输入的查(如果用户没有输入空格),一次按照空格分开查或者分词系统分词结果查,一次按照单个字来查(前提是前面两个结果太少)。

在用Es的时候,如果没有办法正确分词,会按照fuzzy + 单字查(可以同时进行),如果有办法分词,按照分词结果 + 单字查(可以同时)

## 后期维护上:

sphinx的配置文件在mysql分表之后,维护起来是比较麻烦的,你可以用php脚本当做配置文件,这样会好很多。

Es的索引是可以主动发给它去建立的(通过http接口),分表之后,它不关心数据库状态和结构。新增字段可以热更新。

## 扩展性上:

Es和sphinx都支持分布式索引,扩展性都没有问题

两者都支持别名,Es的别名加上动态建立索引,使得更换索引结构或者重建索引后,支持0宕机时间。而sphinx的rotate选项可以动态更新索引(不知道能不能动态创建索引,因为sphinx我在使用的时候,索引都要求写在配置文件里。

性能方面没有测试数据。从直观感受上sphinx要快一些。

 类似资料: