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

2020-08-06 11:10:04 +08:00
 kisshere

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

5212 次点击
所在节点    MySQL
32 条回复
areless
2020-08-06 17:54:28 +08:00
MySQL 估计做不到。。。在内存里搞一棵庞大的 trie 树,跟 ES 速度就差不多了。就是有点废内存~
xcstream
2020-08-06 18:01:32 +08:00
做一个键值对的表
key | value
yellow | yellow wall, yellow xxx,yellow xxxxxx

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

方法就是怎么样
用什么数据库还是内存 都可以
gleport
2020-08-06 18:19:25 +08:00
适合用字典树来实现。把这 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
2020-08-06 18:41:39 +08:00
100 w 好像不多直接放内存,AC 自动机,速度应该不会慢
rocky55
2020-08-06 18:43:41 +08:00
100 w 前缀树的方式存储应该也不会太占内存,如果词不是很长,如果是英文应该就更省了
iyangyuan
2020-08-06 18:48:48 +08:00
分词,倒排
xupefei
2020-08-06 19:22:58 +08:00
Boyer-Moore algorithm
xupefei
2020-08-06 19:25:02 +08:00
@xupefei 多个关键字的话就用 Aho-Corasick algorithm
chihiro2014
2020-08-06 22:11:22 +08:00
倒排索引,Radix 之类的
gladuo
2020-08-06 22:20:04 +08:00
100w AC 自动机还可以,100-200M 空间
wangyzj
2020-08-07 13:24:05 +08:00
mysql 全文检索不咋好使
上 es 把
ifsclimbing
2020-08-11 14:35:08 +08:00
e s

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/696081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX