站内搜索如何提升用户的体验?(1)(图)
优采云 发布时间: 2021-06-04 02:11站内搜索如何提升用户的体验?(1)(图)
转载:
站内搜索一级优化
php1>。概述:
顾名思义,网站上的搜索引擎就是网站中的信息搜索引擎。随着互联网的发展,网站已成为企业或机构最重要的公共形象门户。每天都有大量的潜在客户、合作伙伴、投资者、分析师等登录公司的网站,网站给他们带来的感受将直接影响他们对公司的评价。根据IDC的调查:当用户登录网站时,如果一开始无法快速检索到他需要的信息,50%的用户会立即离开这个网站,60%的用户将不再光顾这个网站 意味着公司将永远失去 30% 的潜在客户。
当然,我没有验证以上数据的准确性,但可以看出,网站上显示的搜索结果质量的准确性对用户体验非常重要。
注:以下搜索引擎特指本站内搜索
php2>。搜索引擎的修养:
优秀的站点搜索除了有醒目的漂亮的搜索框外,还能快速准确地提供用户检索到的结果。此外,还有一些附加功能可以改善用户体验:
1.自动提示:不仅可以减少错误输入,还可以帮助我们推荐产品和产品类别;
2. 自动纠错:与“无搜索结果”相比,结果的显示总是会减少跳出的访问者数量。但这是一把双刃剑。如果推荐词的质量太低,搜索会显得不专业;
3. 相关搜索:基于同义词推荐的能力可以给访问者一些意想不到的搜索提示,增加覆盖率,增加用户点击率。
4.过滤结果或在结果中搜索:给用户更精准的搜索体验;
5. 排序方式:如果搜索有多个属性,比如下载次数、点击次数、或者表单站的评分,这样可以让用户在顶部找到他的关注;
6. 高级搜索.....
此处未列出
php3>。搜索引擎核心技术:
这涉及到的技术有:分词技术(幸好我们不做中文网站)、页面爬取分析(全文搜索)、索引、搜索匹配和排序算法、搜索关键词算法用于统计数据、关联和建议。
php4>。常用的网站搜索方法:
使用大型商业搜索引擎提供的界面:
例如google、yahoo、国内百度API
优点:简单省事,申请账号,使用API;
缺点:1.无法理解具体的搜索排序机制,无法控制显示结果,不利于调整;
2. 免费版有影响体验的广告。
自己实现:
2.1)sql 的喜欢查询:
代码实现比较简单,需要完全匹配搜索字符串,否则搜索不会产生结果,多关键字搜索结果显示效果不佳;
2.2)基于分词的搜索:
有一些开源项目: Lucene,在Java中比较有名,口碑不错,还有很多其他基于它的项目,可以支持大数据量的项目,速度快非常快。 Java项目也可以借鉴和集成在项目中,因为是Java写的,而且前期还需要嵌入表单站,所以只能忍痛割爱;
review的第二个开源项目是Sphinx,C++写的,比较主流,速度快,索引量大,搜索准确率不如Lecence。我试过它编译的exe文件。速度确实很快。听说它搜索到十亿数据级别的时间也是毫秒级别的,索引时间也是小时级别的,以后可以考虑使用;
但是他们都有的问题是,很厉害,但是项目比较大,封装了接口给我们调用。我们需要修改内部算法。可能有更多代码需要跟踪。考虑到时间因素,我们选择了一个轻量级搜索框架sphider,整个项目代码量不到300K,估计死了10000行,基于mysql和php。看完后,简直是高了。这就是我们需要找到的,跟踪它的代码后,就可以大致了解一个搜索引擎整体的工作原理了。我们下面展示的搜索是对其搜索功能的移植和微调:
步骤 1>
获取源数据:如果要检索一个网页的内容,我们需要搭建一个爬虫来抓取需要检索的网页内容,并存入数据库,但是我们转换过来的html pdf其实不是很正规,搜索到的关键词大部分都是猫名或者帖子名,所以我们省略了这一步,直接取数据库中的字段作为元数据;
步骤 2>
分词,提取关键词,创建索引,代码见:SearchindexController.class.php
1)新增数据表:keywords表,keyword_post多个,keyword_cat多个
2)接口:indexallpost(), indexallcat()
注意:分词速度较慢。后来跳出thinkphp框架,用纯SQL写了一个加速版。索引 400,000 条数据大约需要 4-5 分钟。当然和aphinx等还是有很大差距的,有机会再次Release
代码逻辑:
->indexPost() & indexCat():获取数据源内容
->unique_word_array():根据多条规则(分隔符、忽略词、提取词干)对每条数据进行切分
->计算权重(因为描述等都是自动生成的,没有意义,所以权重只是简单计算关键词在数据源中出现的次数)
->save_post_keywords():插入数据库的关键字表,(keyword only一)
->save_post_keywords():然后插入多个关系表(delete_post_keywords_relation():提前删除关系表中的post数据,多表的存在可以缓解单表的压力)
至此,分词完成!
<p>