当前位置:编程学习 > C#/ASP.NET >>

类似京东、易迅、淘宝商品搜索实现原理?

大家好,最近遇到一个需求,各种百思不得其解,碍于身边没有类似经验的人才,特此发帖寻求帮助!
需求我先描述下:
    一个电子商务网站要求可以根据关键词、分类和分类属性进行精确搜索。
    就这么一句话,说起来很简单,实现起来就不是那么简单了。
    先介绍下我的数据结构,也是用了网上比较流行的一种结构:分类、属性、属性值然后关联商品。然后商品做了全文索引,前端根据关键词分词查询全文索引得出结果并聚合(使用hubbledonet全文索引 提供了查询结果聚合某列的功能)结果的分类,展示结果的同时把聚合得到的分类也进行展示,接下来用户可以选择具体分类进一步筛选 选择分类时展示该分类下的所有属性提供精确搜索。
    到这里结束看似需求已经实现了,也给客户看了,看后又加了一个小需求,筛选选择属性得到结果时 把其余不属于结果中的属性隐藏掉。
我去!怎么隐藏?成千上万的商品结果我怎么知道哪些属性有哪些属性没有?聚合?性能怎么办?想的脑子疼!
最后有两个解决方案:
一:把本来一条条商品信息做索引 拆成商品+属性值关联数据做索引,这样本来一条商品变成了N条重复的商品区别就只是属性及属性值不同,这样用户搜索得出的结果我就可以对它进行聚合了,但是查询出的商品重复也不好控制分页 这是一个问题。
二:把搜索结果id拼串到数据库中查询所属属性,这个明显不现实这个方案请忽略!

几条路都走不通但是肯定是有办法解决的 否则其他家电商怎么实现的呢?如果哪位高手有这方面的经验请给我指明一条道路。。。
下面我举一个易迅的例子,前面全是文字大家可能看不太清。


易迅例子搜索:

搜索条件是“手机”,已选择手机分类,已选择品牌是“苹果”,操作系统是“苹果ios”,大家看下接下来的操作。

我继续选择主摄像头像素“500万”,大家看下两张截图的区别,屏幕尺寸由“4.0寸”、“3.5寸”变成只有“3.5寸”,
因为根据筛选条件的出来的结果中没有屏幕是“4.0寸”的商品,所以选择隐藏。 --------------------编程问答-------------------- 我也想了解,绑定! --------------------编程问答-------------------- 主观臆测:这些属性之间是不是也有一个关系表,也就是说属性本身之间就有关系,直接绕过商品 --------------------编程问答-------------------- 你需要做属性到商品的索引表。 --------------------编程问答-------------------- 因为商品(SKU)的属性不会变更的,所以这种规模很大的只读表的建立可以后台定期去做。做好后性能大大提高。类似地,你还可以做更多这种索引表。
甚至将一些查询的path缓存起来。 --------------------编程问答--------------------
引用 2 楼 yanbuodiao 的回复:
主观臆测:这些属性之间是不是也有一个关系表,也就是说属性本身之间就有关系,直接绕过商品

绕不过,因为筛选属性数量是根据结果中有没有该属性决定的 --------------------编程问答--------------------
引用 3 楼 caozhy 的回复:
你需要做属性到商品的索引表。

做属性到商品的索引,那么索引中N条重复数据,增加了全文索引的查询速度不说 也不好控制分页啊 --------------------编程问答--------------------
引用 5 楼 i348018533 的回复:
Quote: 引用 2 楼 yanbuodiao 的回复:

主观臆测:这些属性之间是不是也有一个关系表,也就是说属性本身之间就有关系,直接绕过商品

绕不过,因为筛选属性数量是根据结果中有没有该属性决定的

我的意思是指 属性一的数据会对属性二的数据的筛选产生影响,直白点说  就是属性直接有关系表 --------------------编程问答--------------------
引用 7 楼 yanbuodiao 的回复:
Quote: 引用 5 楼 i348018533 的回复:

Quote: 引用 2 楼 yanbuodiao 的回复:

主观臆测:这些属性之间是不是也有一个关系表,也就是说属性本身之间就有关系,直接绕过商品

绕不过,因为筛选属性数量是根据结果中有没有该属性决定的

我的意思是指 属性一的数据会对属性二的数据的筛选产生影响,直白点说  就是属性直接有关系表

你看 直接搜索的关键词产生的结果会对属性产生影响的,如果是属性之间的关联的话应该首先展示所有属性
--------------------编程问答-------------------- 有个比较愚昧,但也是聪明的办法,产品录入所有属性之后,对产品的所有属性做关联,并且将管理数据全部存储起来。
比如录入了 华为D2 那么该手机有属性 华为 Android 1300w 5寸。

那么在属性关系表就有数据 华为-华为D2  Android-华为D2 1300w-华为D2 5寸-华为D2
华为+Android-华为D2, 华为+Android+1300w-华为D2 等等 …………

这样在查询的时候,比如选到华为,那么从这个关系表就可以很快得到华为下Android的数量,1300w的数量。
选到 1300w 5寸 就很快得到其他属性下的数量。


如此楼主的问题似乎就解决了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,