-
Notifications
You must be signed in to change notification settings - Fork 62
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
使用 MySQL 全文搜索索引的搜索 #46
Conversation
To support SQLAlchemy 3.x debugging
This prevents results like "程序设计A", as "A" is in stopword
To handle jieba cutting names when searching
这个没有看懂,cut_for_search 就是 jieba 分出来的词呀,为什么会出现 indexing 和 search query 分词结果不一致的情况呢? |
>>> list(jieba.cut_for_search('计算机程序设计'))
['计算', '算机', '计算机', '程序', '设计', '程序设计']
>>> list(jieba.cut('计算机程序设计'))
['计算机', '程序设计']
>>> list(jieba.cut('计算机程序'))
['计算机程序'] |
我之前用elasticsearch 的时候也遇到了这些问题。我后来查了es文档,自己测试感觉最优实践是indexing的时候,同时依据最小分词和最优分词同时index,search的时候用最小分词这样命中率会比较高。 次优方式是保证search和index需要保证使用相同的index模式。 |
Just don't commit for every add.
- Use limit in SQL when getting latest notifications - Add index for ReviewHistory.course_id
我本地测试感觉改得差不多了。目前的做法是: 数据库表给 cache 表强制 collation="utf8mb4_unicode_ci" 是有必要的,因为会有 "英语交流Ⅰ"(罗马数字 1)这样的搜索,需要能对应到 "英语交流I"(大写的 i)。本地测试的时候加 mysqld 配置似乎没有生效,所以在代码里面加了 collation。 课程搜索
评论搜索评论搜索的逻辑简单得多,直接分词,然后 Cache 表和 Review join 之后全文搜索、根据用户权限 filter。最后排序的时候先按照 MySQL 给出的相关度排序,相关度一致的就按照更新时间倒序。 其他的优化
其他在 tests 下面添加了一些用来测试搜索的脚本。 |
已经上线了,多谢 @taoky 的贡献 |
现在搜索功能挺好的,我测试了都没有问题,搜索的数据库查询确实加速了不少。 现在点评搜索还没有 ranking,比如输入两个关键词,两个关键词同时匹配的点评应该排在前面。但之前和现在的搜索都没有 ranking 机制,是按照发表时间简单降序排列的。 |
刚刚跟 @taoky 聊了下,发现是我测试的 query 恰好包含了中文分词出错的 case(是一个人名被拆成了两个词)。当分词没有出错的时候,已经实现了按照相关度匹配,就是多个关键词同时匹配的点评排在前面。Well done! |
解决目前搜索功能性能太差的尝试,需要在实际数据上测试性能和搜索效果(主要是点评,我没有测试的条件)。
解决思路:
text
字段存储用于全文搜索的字符串,并且构建 fulltext index;如何测试:
python -m tests.manage_searchcache --init-course --init-review
初始化 cache 表内容目前效果:
另外确实存在原来能够搜索到的,目前这个方案搜索不到的情况,比如说「计算机程序」会被 jieba 分为完整的词,但是
cut_for_search
预处理的时候分得更细,所以会没有结果。