Repository navigation
使用 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预处理的时候分得更细,所以会没有结果。