查看: 3800| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

[找工就业] 找实习遇上的一个搜索系统设计题,求建议

全局:

2017(7-9月)-CS本科+3个月-1年 | 网上海投|大波士顿地区 码农类General实习@genospace

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近投了一个叫Genospace的小公司的实习,有一个比较简单的搜索系统设计题,请大佬来看看我的实现有什么需要改进的。
.
题目大意是会给一个药物的数据集,根据用户搜索的条件能搜索出相关药物的结果,点击结果会显示药物的细节资料。

然后貌似要实现一个即时搜索的功能,类似google搜索,像我们在google主页的框里打字没按回车的时候,搜索结果就会出来,然后修改框里的input的时候,搜索结果又会自己改变。
. ----
我目前的实现思路是用node后端,然后前后端用socket来监听用户是否在输入的event,然后用户修改了输入的话,前端自动读这个输入然后传给后端,后端再在mongodb里进行搜索,然后返回搜索结果给前端,
前端监听到返回结果的event的时候,把结果放进html的template里面然后append在一个div下面。
. Χ
这样可以大概实现这样的即时搜索(?其实我也不知道这个feature叫什么。。),但是问题就是我不确定如何实现搜索结果的pagination,导致有时候比如搜索的input只有一两个字母的话,匹配结果可能会有几千条,这样搜索结果没有分页的话整个页面就很卡顿。。。. Χ
. .и
所以大佬们来做的话会是什么思路呢?本人web dev经验比较少,所以有说错的地方请轻喷。。。

上一篇:霸王 知识产权条款?
下一篇:简历投完多久笔试呢
推荐
阿矾 2017-8-18 05:07:14 | 只看该作者
全局:
1. 不一定需要pagination 。你用google的时候,备选项也就那么5个。

2. 随时监听你的后端负担太大,做个trie放在CDN上然后塞进前端。每隔一段时间更新一下trie(删除数据库中已经remove了的词条,更新新加的词条)。
回复

使用道具 举报

推荐
nikki3128 2017-8-18 04:05:10 | 只看该作者
全局:
- 关于问题:搜索的是药物名还是任何药物的文档中包含的数据?
- 感觉这个问题考察的应该是怎么作出一个可用的service吧?. Waral dи,
- 像Google或者其他搜索引擎,感觉输入框的提示是自己或者别人输入过的搜索关键字,也就是说搜索框提示内容与药物的文档内容无关。(此处说明要搜索的数据其实是被搜索过的关键字,并且说明在用户最后按下enter的时候,我们要向实现这个service的数据库写入这条关键字。)
- 我觉着,有个瓶颈是,typing过程的滞留时间很短,如果每次都要网络async request的话,用户已经输入了后续的东西了,这样就导致service已经无效了其实。所以,这点上我没啥把握。我觉得如果是一直request, 速度很可能不够快,那么就需要基于已输入的关键字筛选,并且在local cache下来,之后就基于cache来搜索。
- request 发送到后端要怎么搜索?我觉得最高效的方式肯定是算法里面的trie tree的实现,和这个需求一模一样,不过我不知道是不是有现成的工具来做这事儿。  次之,如果是搜索文本相似性,lucence 貌似可用?
. check 1point3acres for more.

- 前端async request部分支持youngyang的思路。

---------
小白,求大神狠狠地教育。.google  и

. 1point 3acres

补充内容 (2017-8-18 04:07):.1point3acres
我问的关于问题的部分,其实是确定药物名是不是要成为被搜索数据的一部分,还是说完全给予过往用户输入过的关键字。

在这个service冷启动过程中,其实可以拿个脚本人为创建一些可能的关键字。。。。 . Χ

. 补充内容 (2017-8-18 04:07):. 1point3acres.com
给予 == 基于
回复

使用道具 举报

推荐
nikki3128 2017-8-18 12:17:01 | 只看该作者
全局:
zhanym0981 发表于 2017-8-18 11:25-baidu 1point3acres
谢谢回答!要求是搜索药物的名称 所以我认为应该不用管被搜索过的关键字吧。我现在管理typing时间和reque ...

- 如果只是搜索药物名称,整个trie应该不会很大?那就可能直接建一个TRIE就OK啦。这样页面打开后直接异步传到前端是不是都可行?(或者通过输入的前几个字母缩小trie的范围之后异步传过去?)(如果整个传的话,是不是可以考虑直接在前端cache下来,这样只要trie不改变,browser cache不清除,基本整个数据结构就不用重复传输了。除第一次打开页面外,其他次打开都瞬间可用。)
- CDN的方案也是很酷!(我学习了)
回复

使用道具 举报

🔗
youngyang 2017-8-17 23:08:00 | 只看该作者
全局:
用JS监听搜索的input,然后用ajax向后端请求数据再显示出来就好了吧
回复

使用道具 举报

🔗
luochen01 2017-8-17 23:45:42 | 只看该作者
全局:
只向数据库搜索前N条(比如10)结果应该就可以了
回复

使用道具 举报

🔗
 楼主| zhanym0981 2017-8-18 00:29:22 | 只看该作者
全局:
youngyang 发表于 2017-8-17 23:08
用JS监听搜索的input,然后用ajax向后端请求数据再显示出来就好了吧

请问用ajax和node的socket有什么区别吗?比如效率上的?
回复

使用道具 举报

🔗
 楼主| zhanym0981 2017-8-18 00:30:28 | 只看该作者
全局:
luochen01 发表于 2017-8-17 23:45
只向数据库搜索前N条(比如10)结果应该就可以了

嗯嗯这是一个方法。可是下一轮面试是onsite然后他们组里的人会根据你的系统继续要求implementation 所以我怕万一他要我做pagination那不就gg了。。。
回复

使用道具 举报

🔗
luochen01 2017-8-18 01:37:49 | 只看该作者
全局:
zhanym0981 发表于 2017-8-18 00:30.
嗯嗯这是一个方法。可是下一轮面试是onsite然后他们组里的人会根据你的系统继续要求implementation 所以 ...

这算是一种简化版的pagination,只取第0页的N条数据。
如果是pagination,只要算出来数据的开始位置(offset)和每个页面数据的数量(limit)就可以了。
回复

使用道具 举报

🔗
 楼主| zhanym0981 2017-8-18 10:05:46 | 只看该作者
全局:
谢谢大家解答 我会参考下!
回复

使用道具 举报

🔗
 楼主| zhanym0981 2017-8-18 11:25:01 | 只看该作者
全局:
nikki3128 发表于 2017-8-18 04:05
- 关于问题:搜索的是药物名还是任何药物的文档中包含的数据?. .и
- 感觉这个问题考察的应该是怎么作出一个可 ...

谢谢回答!要求是搜索药物的名称 所以我认为应该不用管被搜索过的关键字吧。我现在管理typing时间和request的关系是typing结束后3秒才发送emit一个event给后端,不知道这个实现会不会太简单?
然后现在后端搜索直接是用的mongooseModel.find 效率貌似后期会成问题,打算看看您说的trie和lucence 谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表