V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wannianma
V2EX  ›  PHP

站内全文搜索采用什么方案比较快?

  •  
  •   wannianma · 2016-07-26 17:32:54 +08:00 · 15093 次点击
    这是一个创建于 3069 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在站点的内容到达了百万的量,突然发现原来基于 like 的站内搜索已经奇慢无比了,在网上搜了一下好像Sphinx是一种可行的方案,但还是有些纠结。希望大家帮忙提供一下思路

    66 条回复    2018-12-15 18:22:41 +08:00
    miaotaizi
        1
    miaotaizi  
       2016-07-26 17:37:19 +08:00
    xunsearch
    dong3580
        2
    dong3580  
       2016-07-26 17:41:16 +08:00
    solr
    jugelizi
        3
    jugelizi  
       2016-07-26 17:42:32 +08:00
    代码可以参考 phpcms 的 sphinx
    acrisliu
        4
    acrisliu  
       2016-07-26 17:48:32 +08:00
    elasticsearch
    wannianma
        5
    wannianma  
    OP
       2016-07-26 17:50:18 +08:00
    @miaotaizi 谢谢,我研究一下!
    wannianma
        6
    wannianma  
    OP
       2016-07-26 17:54:37 +08:00
    @dong3580 solr 只是听说过,会不会太重了?
    sinux
        7
    sinux  
       2016-07-26 17:57:17 +08:00
    @acrisliu es 感觉中文分词库没有太好的.....
    2owe
        8
    2owe  
       2016-07-26 17:59:29 +08:00
    用过 Coreseek ,基于 Sphinx ,有索引大小限制: 4G ,超过的话得自己搭分布式。官网最近挂了,但网上还能找到很多资料,用起来难度不大。

    我用的数据源是 MySQL ,索引的字段内容都不大。

    关于使用,我觉得用起来还是挺简单的。用的 PHP 哈。其实代码实现上, XunSearch , Solr , Elestic 都差不多。

    关于搜索结果,一看分词。 Coreseek 自带中文分词,我觉得用起来还行(比 XunSearch 自带的好一点), Apache 系的这俩没正式用过,听说分词效果可以调到不错的样子。二看条件过滤, Coreseek 用起来简直像在用搜索速度快很多的 MySQL 。话说,别的用起来也差不多吧。

    关于资源占用,感觉内存占用不高,与量有关,与实体索引文件对比大约是: 1vs1 。


    ===

    关于搜索的话题,我也仅仅是浅尝辄止,欢迎讨论哈。
    wannianma
        9
    wannianma  
    OP
       2016-07-26 18:04:33 +08:00
    @sinux 做科研的人其实整理除了一些不错的中文词库,中科院的 ICTCLAS 之前用过听不错。但是中文新词更新太快,词库根本没法做到百分百覆盖
    wannianma
        10
    wannianma  
    OP
       2016-07-26 18:04:45 +08:00
    @jugelizi 谢谢
    HarveyDent
        11
    HarveyDent  
       2016-07-26 18:06:26 +08:00
    我们用的是阿里云提供的搜索。
    lijinma
        12
    lijinma  
       2016-07-26 18:14:38 +08:00
    有钱可以用 阿里云 的 OpenSearch
    xujif
        13
    xujif  
       2016-07-26 18:16:41 +08:00   ❤️ 1
    百万级别直接用数据库的分词搜索足够。 mysql 的 match against pg 的 ts_query
    wannianma
        14
    wannianma  
    OP
       2016-07-26 18:28:26 +08:00
    @xujif 第一次接触,研究一下!
    xiaoz
        15
    xiaoz  
       2016-07-26 18:29:03 +08:00 via iPhone
    反代谷歌, site 搜索
    wannianma
        16
    wannianma  
    OP
       2016-07-26 18:30:03 +08:00
    @xiaoz 之前也考虑过使用百度进行搜索,但是感觉定制性较差
    dong3580
        17
    dong3580  
       2016-07-26 18:45:21 +08:00
    @wannianma
    还好,耗 RAM 大户.
    你可以参考它的思想,
    tracymcladdy
        18
    tracymcladdy  
       2016-07-26 18:58:57 +08:00
    solr+1
    9nix00
        19
    9nix00  
       2016-07-26 19:11:58 +08:00
    百万这个级别,如果是一般的网站应用,单台 sphinx+redis 毫无压力。

    后面如果还会有爆发到上亿规模,还是老老实实上 es 吧。
    wmttom
        20
    wmttom  
       2016-07-26 20:13:53 +08:00
    elasticsearch + 1
    rale
        21
    rale  
       2016-07-26 20:20:13 +08:00
    elasticsearch + 1
    lyc1116
        22
    lyc1116  
       2016-07-26 20:53:30 +08:00
    solr, 或者可以试试 AWS 的 elasticsearch ,但是中国区还不支持。
    pango
        23
    pango  
       2016-07-26 21:57:53 +08:00
    搭车问一下繁体中文(台湾)有没有什么好的分词词库,最好直接能拿来搭配 sphinx 的 python api 用的?
    batis25
        24
    batis25  
       2016-07-26 22:24:59 +08:00
    elasticsearch
    laravel
        25
    laravel  
       2016-07-26 22:51:46 +08:00
    elasticsearch + 1
    dodo2012
        26
    dodo2012  
       2016-07-27 01:04:51 +08:00
    es+1
    strwei
        27
    strwei  
       2016-07-27 02:21:11 +08:00
    sphinx+1
    kn007
        28
    kn007  
       2016-07-27 08:31:04 +08:00
    mark ,用过 sphinx ,一般
    tomoya92
        29
    tomoya92  
       2016-07-27 09:10:50 +08:00
    没人用 hibernate search 吗?

    PS @Livid 回复快捷键貌似失效了
    ctrl/command+enter chrome 浏览器
    lszxlong
        30
    lszxlong  
       2016-07-27 09:12:49 +08:00
    elasticsearch 好用,非常方便
    wannianma
        31
    wannianma  
    OP
       2016-07-27 09:15:17 +08:00
    @xujif 试了一下, mysql 加了全文索引,果然提升很明显!
    simapple
        32
    simapple  
       2016-07-27 09:18:00 +08:00
    mysql 5.7 innodb 支持中文全文索引
    nightspirit
        33
    nightspirit  
       2016-07-27 09:32:50 +08:00
    mysql 5.6 就支持全文索引了
    lawmil
        34
    lawmil  
       2016-07-27 10:14:14 +08:00
    elasticsearch 这个比较靠谱
    dqh3000
        35
    dqh3000  
       2016-07-27 10:18:26 +08:00
    @wannianma 试过 postgres + tsquery ( tsvector , td_rank ) + gin 索引

    百万级别的文本,内容是小说,没有问题
    tabris17
        36
    tabris17  
       2016-07-27 10:26:47 +08:00
    elasticsearch + 2
    mrytsr
        37
    mrytsr  
       2016-07-27 10:30:28 +08:00 via Android
    es
    xujif
        38
    xujif  
       2016-07-27 10:33:30 +08:00
    @wannianma 好用就行,报个搜索时间?
    server
        39
    server  
       2016-07-27 10:45:18 +08:00
    es 吧,给你提供的不仅仅是全文检索
    huangzxx
        40
    huangzxx  
       2016-07-27 11:02:15 +08:00
    elasticsearch 吧
    ljbha007
        42
    ljbha007  
       2016-07-27 11:20:34 +08:00
    中小型网站用 postgresql 自带的 fts 配合中文分词插件就够了
    derek80
        43
    derek80  
       2016-07-27 12:27:30 +08:00
    elasticsearch +1
    towser
        44
    towser  
       2016-07-27 13:21:36 +08:00
    千万级 coreseek
    更多 elasticsearch
    hwsdien
        45
    hwsdien  
       2016-07-27 13:33:34 +08:00
    直接上 Elasticsearch
    minongbang
        46
    minongbang  
       2016-07-27 14:05:27 +08:00
    http://itzdm.com/ 我这个用的 xunsearch
    hyiier
        47
    hyiier  
       2016-07-27 14:12:45 +08:00
    xunsearch 不需要解决中文分词的问题,我的网站就是用 xunsearch 做的全站搜索 www.yii-china.com 可以来看看效果
    fengkuok
        48
    fengkuok  
       2016-07-27 14:22:34 +08:00
    百万级别难道没人用 PostgreSQL 的全文检索吗?当然,一次性到位的话还是用 ES 靠谱。
    Reign
        49
    Reign  
       2016-07-27 14:29:28 +08:00 via Android   ❤️ 1
    说句 v2 政治不正确的话,我一直觉得 elasticsearch 真的是炒作出来的东西,坑实在太多,我每次用都气的想把我的显示器砸了
    slixurd
        50
    slixurd  
       2016-07-27 14:44:49 +08:00
    @Reign 例如 ES 自己作死加了个 Type....
    你遇到什么坑了,说来听听....学习一下
    defunct9
        51
    defunct9  
       2016-07-27 15:00:00 +08:00
    @slixurd 为毛不加 Type ?加了 type 好断词吧
    fork3rt
        52
    fork3rt  
       2016-07-27 15:09:36 +08:00
    sphinx 挺好用的,文档也全。
    slixurd
        53
    slixurd  
       2016-07-27 15:19:20 +08:00
    @defunct9
    因为 Lucene 里面没有 Type 这种东西, ElasticSearch 的 Type 实际上是在整个搜索的外层加了个一个 BooleanQuery ,然后把 Type 作为一个 Filter 条件放进去搜索的伪 Type ,另外由于 5_4_x 的 BUG ,会导致性能变差大概 20%( 5_5 修复了这个问题
    defunct9
        54
    defunct9  
       2016-07-27 16:41:17 +08:00
    @slixurd 没用过 lucene ,这样就只好自己写 java 的 lucene 了。比起来还是用 e 吧。
    tianshiyeben
        55
    tianshiyeben  
       2016-07-27 16:42:43 +08:00
    elasticsearch
    wuhang89
        56
    wuhang89  
       2016-07-27 20:58:49 +08:00
    elasticsearch+1
    jimmy0017
        57
    jimmy0017  
       2016-07-27 21:01:42 +08:00
    elasticsearch 不错。但没试过
    zwh8800
        58
    zwh8800  
       2016-07-27 22:22:02 +08:00
    elasticsearch 不错, RESTful 的 api ,用着很舒服
    fire5
        59
    fire5  
       2016-07-27 22:30:23 +08:00
    Elasticsearch
    loveyu
        60
    loveyu  
       2016-07-27 22:44:41 +08:00
    Elasticsearch 面对产品神奇的需求就是个渣渣
    hard2reg
        61
    hard2reg  
       2016-07-27 23:22:48 +08:00
    google site:xxx.com keyword
    jswh
        62
    jswh  
       2016-07-28 09:10:44 +08:00
    @defunct9 elasticsearch 用的是 Lucene 的引擎,索引用 es 就可以了
    jason19659
        63
    jason19659  
       2016-07-28 10:02:02 +08:00
    elastic 5.0
    kwklover
        64
    kwklover  
       2018-01-02 14:31:29 +08:00
    可以试试搜易站内搜索引擎 http://www.searcheasy.net
    完全无需开发,点点鼠标完成站内搜索
    echope
        65
    echope  
       2018-11-19 17:27:35 +08:00
    没想到两年后用 es...
    huobazi
        66
    huobazi  
       2018-12-15 18:22:41 +08:00
    @slixurd
    @defunct9

    然鹅,type 又作死的要去掉了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2820 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 07:47 · PVG 15:47 · LAX 23:47 · JFK 02:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.