1
happywowwow 2014-09-17 15:47:48 +08:00 1
昨天刚好看到 match()against 你可以去看看? 我也不是很懂,看见代码里有人这么写的,去搜了下,说是比like好
|
2
mengzhuo 2014-09-17 15:53:16 +08:00 1
5.5以后支持了FullText Search
|
3
em70 2014-09-17 15:58:25 +08:00 1
看你数据有多大的量,量不大,like就足够了,如果很大量就不能单纯依靠数据库,要用搜索引擎技术,先对内容做分词处理,建立反向索引,存到数据库.这会占用大量的空间,但查询速度和精度可以大大提高. 计算机永远是时间换空间,空间换时间的游戏
|
4
nilai 2014-09-17 16:00:07 +08:00 1
sphinx
|
5
shyrock OP @happywowwow
@mengzhuo @em70 你们说的都是全文检索吧, 问题是建立的全文检索索引后,我理解只能匹配整词的输入条件,但是对于想用‘%ord'搜索到’Word‘的情况能match against到吗? |
8
Livid MOD |
9
davepkxxx 2014-09-17 16:28:58 +08:00
数据量大的花使用全文检索系统代替like
|
10
qsun 2014-09-17 16:38:00 +08:00 1
我知道我下面说的会被人喷,但是我还是要说:
就10万100万的数据,如果是考虑性能的话,根本不用 sphinx/elasticsearch 这种 full-text search engine。尽量让数据保持热度就可以了。 如果用了 sphinx/elasticsearch,还需要重新考虑各种过滤。 |
11
shyrock OP @love 据说可以加反向索引来解决,这个链接提到了,但是语焉不详: http://www.kuqin.com/database/20120207/317909.html
我又搜到另外一篇,比较靠谱,是建立function index + reverse的方式: http://jeffkemponoracle.com/2008/01/17/like-with-wildcard-at-start-can-use-an-index/ |
12
shyrock OP @Livid 看了一下,elasticsearch是基于lucene的吧,实际上我们的系统中已经基于lucene搭了个全文检索。但是不能支持非整词匹配的模糊查询是个问题。
|
17
em70 2014-09-17 20:08:09 +08:00
@shyrock 被检索字段数据量有多少,如果只是255以内,几十万的记录like问题应该也不大,服务器内存大点就OK了,100万以上,还是考虑反向索引吧,like不适合
|
19
em70 2014-09-17 20:29:13 +08:00 2
@shyrock 反向索引的意思是,把一段文本里的每个词都与原文建立对应关系,也就是说,一段文字有100个单词,那么需要创建100条记录,搜索的时候不搜索原文,在这100个记录里面查找,有匹配就说明原文里有这个单词,这100个记录建立索引查找就很快
谷歌百度他们,不光词做反向索引,还把多个连续词一起索引,甚至一句话也索引,一个网页可能建立几十万个反向索引,索引库可能几百亿,上千亿,实时搜索还是慢,这时他们还用了缓存技术,提前把可能搜到的词的搜索结果计算出来保存 |
22
cloudzhou 2014-09-17 23:18:41 +08:00
如果对 lucene 比较熟悉,可以直接使用 lucene 来做
|
23
GTim 2014-09-17 23:25:04 +08:00
谁说like %关键字 没法用索引的,是like %关键字% 没法用索引
|
24
pubby 2014-09-17 23:27:45 +08:00 1
|
25
zyx89513 2014-09-17 23:52:55 +08:00
@pubby 是啊中文, 那个coreseek我看了好像很久没更新了一样。 所以你觉得还是elasticsearch好一些是么? 我看有个插件elasticsearch-river-jdbc可以配合 MySQL 一起使用
|
29
6711411 2014-09-18 10:55:05 +08:00
有人使用过 sphinx 做地理位置搜索吗? 有的话请回复我一下, 有问题请教...
|
30
halfelf 2014-09-18 11:11:33 +08:00
es做regex filter显然可以解决这个问题
|
31
em70 2014-09-18 12:24:37 +08:00
@shyrock 这需要一些优化技巧,首先单词就那几千个,可以先在单词表like搜索,找到最可能匹配的单词,然后用这个单词再去反向索引库搜索
|
33
RangerWolf 2014-09-19 09:27:58 +08:00
AWS DynamoDB 便宜好用~ 而且非常非常的diao
100W的数据,查询延迟还是能做到毫秒的级别,而且不需要你去关心底层如何优化。如果全套托管在AWS的话,WebApp放Elastic Beanstalk。 每个月不会超过10$的费用。甚至连10¥都不一定需要。注意:导入数据到DynamoDB是免费的! 流量不花钱。 AWS的问题就是服务太多了,不熟悉的情况下不知道哪个合适自己。。。。 刚用上AWS,发现太赞了,所以强烈推荐。 |
34
RangerWolf 2014-09-19 09:29:31 +08:00
@shyrock 关于你要查询W/ord 这种需求。感觉就需要你针对业务去仔细设计一下DB的结构了。 Good luck 哈哈
|
35
RyanArthur 2020-02-26 18:02:26 +08:00
如果有同学查到这里,我要为大家填一个坑,FTS ( FullText Search) 的使用与 InnoDB 和 MyIASM 有关系。如果使用 InnoDB,那么如果查询的关键字小于 innodb_ft_min_token_size 的约定或者大于 innodb_ft_max_token_size 的约定值,那么 FTS 会直接忽略查询结果。如果使用 MyIASM,是 ft_min_token_size 和 ft_max_token_size。
|