› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
kisshere
V2EX  ›  MySQL

MySQL 存储了 100 万个词组,给出一字符串,怎样最快找出 100 万个词组中存在的词组?

  •  
  •   kisshere · Aug 6, 2020 · 6846 views
    This topic created in 2290 days ago, the information mentioned may be changed or developed.

    MySQL 中存储的词组,比如:yellow wall,little cat,brown cat 、yellow dog 、coffee cup 之类的完全不同的词组总共 100W 行,现在给出一个句子,比如:“a little cat is sleeping behind a yellow wall with a yellow dog”,怎样以最快速度提取出这个 100W 词组中存在的词组:yellow wall,little cat 、yellow dog

    32 replies  •  2020-08-11 14:35:08 +08:00
    wangkun025
    wangkun025
    Aug 6, 2020
    1
    预处理好。
    yrj
    yrj
    Aug 6, 2020 via iPad
    2
    全文检索?
    bestsanmao
    bestsanmao
    Aug 6, 2020
    3
    select 字段名 from 表名 where instr('你的句子', 字段名)<>0
    err1y
    err1y
    Aug 6, 2020 via iPhone
    4
    jieba 分词
    PhilC
    PhilC
    Aug 6, 2020
    5
    先分词呗
    hbolive
    hbolive
    Aug 6, 2020
    6
    上分词系统比较好,这么直接 mysql 查没搞过。。
    iblislsy
    iblislsy
    Aug 6, 2020
    7
    把 100w 个词组添加到 jieba 的分词 dict,python 分词完直接用 counter 统计。
    lithbitren
    lithbitren
    Aug 6, 2020
    8
    分词哈希,前缀树都可以,100W 个词读进内存也没多少,成熟的轮子也时一沓一沓的
    qiayue
    qiayue
    Aug 6, 2020❤️2
    9
    经典的倒排索引使用场景
    sadfQED2
    sadfQED2
    Aug 6, 2020 via Android
    10
    分词,上 es,mysql 或许不行吧? mysql 能改分词器吗
    zxcvsh
    zxcvsh
    Aug 6, 2020 via iPhone
    11
    试试 ES 吧,如果场景合适的话
    rockyou12
    rockyou12
    Aug 6, 2020
    12
    mysql 原生做不到
    ic2y
    ic2y
    Aug 6, 2020
    13
    100 万条词组,首先向量化,例如 yellow wall,可以标记为 [1,2] 1 表示 yellow,2 表示 wall

    以此类推,little cat,可以标记为 [1, 3] 3 表示 cat 。

    100 万条 向量化的词组,就是 100 万条 整形数组的序列,把这个序列变成 一个字典前缀树。

    Node{
    int value;
    Map<Interget,Node> childs;
    }

    这棵树,在 100 万的量级,应该不大。都是整形的。保存在内存中。

    遇到 a little cat is sleeping behind 就向量化,变成 23 45 18 1 4 之类的数字,

    从 23 开始,依次从字典前缀树的 root,开始匹配,是否能匹配到叶子节点。如果匹配到,就输出。

    否则,继续匹配 45 、18 等。
    leapV3
    leapV3
    Aug 6, 2020
    14
    先分词 再查询
    TimePPT
    TimePPT
    Aug 6, 2020
    15
    请求量大上 ES
    请求量不大,可以看看这个?
    《 FlashText:语料库数据快速清理利器》
    https://www.jiqizhixin.com/articles/2017-11-10-4
    wjhjd163
    wjhjd163
    Aug 6, 2020 via Android
    16
    同上,倒排索引
    直接查询还想要高速是肯定不可能的,这个结构还需要变化才行
    如果数据少那直接分词后搜索即可
    freelancher
    freelancher
    Aug 6, 2020
    17
    我的原始思路是先分词。然后第一个词,一个个字母去对。

    O 了。这个是算法题吧。应该有解的。
    oscer
    oscer
    Aug 6, 2020
    18
    ES
    lau52y
    lau52y
    Aug 6, 2020 via iPhone
    19
    es 最合适了吧
    RJH
    RJH
    Aug 6, 2020
    20
    何苦这样迫害 mysql 呢,人家原生就不是用来搞全文检索的,有 ES 不香吗?
    areless
    areless
    Aug 6, 2020 via Android
    21
    MySQL 估计做不到。。。在内存里搞一棵庞大的 trie 树,跟 ES 速度就差不多了。就是有点废内存~
    xcstream
    xcstream
    Aug 6, 2020
    22
    做一个键值对的表
    key | value
    yellow | yellow wall, yellow xxx,yellow xxxxxx

    然后分成一个一个单词 看到 yellow 就去找这个表

    方法就是怎么样
    用什么数据库还是内存 都可以
    gleport
    gleport
    Aug 6, 2020
    23
    适合用字典树来实现。把这 100 万个词组从 MySQL 读出存进一棵字典树里,不会消耗多大内存。

    一百多行左右的核心代码就可以完成了:

    ```go
    package main

    import (
    "fmt"

    "github.com/hmgle/trie-x/go/trie"
    )

    func main() {
    t := trie.New()
    t.Insert("yellow wall", 1)
    t.Insert("little cat", 1)
    t.Insert("brown cat", 1)
    t.Insert("yellow dog", 1)
    t.Insert("coffee cup", 1)

    content := "a little cat is sleeping behind a yellow wall with a yellow dog"
    hits := t.ScanContent(content)
    for _, hit := range hits {
    fmt.Printf("word: %s, offset: %d\n", hit.Word, hit.Offset)
    }
    }
    ```

    输出:

    ```
    word: little cat, offset: 2
    word: yellow wall, offset: 34
    word: yellow dog, offset: 53
    ```
    rocky55
    rocky55
    Aug 6, 2020❤️2
    24
    100 w 好像不多直接放内存,AC 自动机,速度应该不会慢
    rocky55
    rocky55
    Aug 6, 2020
    25
    100 w 前缀树的方式存储应该也不会太占内存,如果词不是很长,如果是英文应该就更省了
    iyangyuan
    iyangyuan
    Aug 6, 2020 via iPhone
    26
    分词,倒排
    xupefei
    xupefei
    Aug 6, 2020 via iPhone
    27
    Boyer-Moore algorithm
    xupefei
    xupefei
    Aug 6, 2020 via iPhone
    28
    @xupefei 多个关键字的话就用 Aho-Corasick algorithm
    chihiro2014
    chihiro2014
    Aug 6, 2020
    29
    倒排索引,Radix 之类的
    gladuo
    gladuo
    Aug 6, 2020
    30
    100w AC 自动机还可以,100-200M 空间
    wangyzj
    wangyzj
    Aug 7, 2020
    31
    mysql 全文检索不咋好使
    上 es 把
    ifsclimbing
    ifsclimbing
    Aug 11, 2020
    32
    e s
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   963 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 19:42 · PVG 03:42 · LAX 11:42 · JFK 14:42
    ♥ Do have faith in what you're doing.