论坛首页 Java企业应用论坛

分类搜索,该怎么做

浏览 6953 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-15   最后修改:2012-10-15

  大家好
   首先说下我遇到的问题:
    比如商品,分了很多类,

 

A

A1

A11

A111

A112

A12

A2

A3 

B

C



如此,我点击A大类那应该显示的商品会包括A1,A2,A11,A12,A111,A122等等,只要是A大类下面的都应该显示,
那么数据库该如何设计?
我现在是这么设计的:categoryid,categoryCode,categoryname,categoryparentCode.用Code 和parentCode 将他们关联起来
这样以来再大类查询时就出问题了,如果用like 查询那么可能会出差错,并不能完全约定的Code.是吧?

搜索的时候如果要遍历category 的整个集合点也是很困难的。

目前我使用的方案是:
使用lucene 做N次索引。
具体如下:
如果一个商品是A1下,那么就向A,A1这2个索引里面添加,如果是A111那就必须添加A,A1,A11,A111四个索引了,感觉虽然查询起来是方便了但是索引有点多,不是太完美。

不知道各位道友是如何解决这个问题的呢,小生谢谢了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   发表时间:2012-10-15  
目前我使用的方案是:
使用lucene 做N次索引。
具体如下:
如果一个商品是A1下,那么就向A,A1这2个索引里面添加,如果是A111那就必须添加A,A1,A11,A111四个索引了,感觉虽然查询起来是方便了但是索引有点多,不是太完美。

你的方案完全可以啊。。

也可以这样的方案。。你就只把A/A1/A11/A111 这样建一个索引。。然后就按前缀搜索就行了。。
0 请登录后投票
   发表时间:2012-10-15  
如果你的数据不多,且不做分类的移动, 且分类最大深度是固定的,比如就分4级,那把每一级做为数据库一个字段,就最简单了。

categoryid1  categoryid2  categoryid3  categoryid4 这样每一条记录都包含这4个字段。

当然现实中可能需求比较复杂,没办法这么简单的搞定。
你的方案能work的不错就行了,何必纠结呢
0 请登录后投票
   发表时间:2012-10-15  
就使用categoryid,categoryCode,categoryname,categoryparentCode这样就足够了。
对于categoryCode的设计,可以先做分析控制。
比如你的举例为4级,每一级别的量级应该也是可控的吧。
那么可以设计为AAABBBCCCDDD,
对于最大类标示code为AAA,第二级别为AAABBB,第三级别为AAABBBCCC,第四级别为AAABBBCCCDDD。
关于父节点就存储上一级的code就可以了。
这样直接做某一大类的查询,like就可以直接搞定了。
0 请登录后投票
   发表时间:2012-10-15   最后修改:2012-10-15
增加一个path字段。 把一个分类的完整路径拼成这个字段。

比如 一个分类的id是 1.他的子分类是2 他的孙子的分类是3

这样孙子id的path就是 /1/2/3

查询的时候
select * from 表 where id in (
select id from 表 where path like '/1/%'


就能查到1下面的所以子孙分类。

而且根据path字段 split后 就能很方便的获取当前分类的层级路径。

如果你是在搜索引擎里。。id肯定不能分词。
你建的时候 用 id 空格 id 空格 id表示path。
0 请登录后投票
   发表时间:2012-10-15  
如果系统的业务简单,分类的数据量不是很大

完全可以用我这种方法,通过id入手。

001
001001
  001001001
  001001002
001002
001003
001004

所以建表的时候连父节点这个字段都可以省了。直接通过id就可以判断他的父节点还有深度,查询更简单,一个like搞定

缺点就是这种设计分类层级的数量是有限定的,001开始表示该节点下数量最多是099,如果超过了099那么业务就会发生错误

当然可以根据你的业务去定义他的初始数值,可以定义为0001或者00001,这样容纳的数据就会更多。
0 请登录后投票
   发表时间:2012-10-15  
java_project 写道
就使用categoryid,categoryCode,categoryname,categoryparentCode这样就足够了。
对于categoryCode的设计,可以先做分析控制。
比如你的举例为4级,每一级别的量级应该也是可控的吧。
那么可以设计为AAABBBCCCDDD,
对于最大类标示code为AAA,第二级别为AAABBB,第三级别为AAABBBCCC,第四级别为AAABBBCCCDDD。
关于父节点就存储上一级的code就可以了。
这样直接做某一大类的查询,like就可以直接搞定了。


这个方案想来想去不太好,最主要的是分类是回更改的,一旦更改,AAABBBCCC这样子的怎么好去跟新呢。like 去匹配的话,性能较差不说,可能会出现误差。
0 请登录后投票
   发表时间:2012-10-15  
leonayx123 写道
增加一个path字段。 把一个分类的完整路径拼成这个字段。

比如 一个分类的id是 1.他的子分类是2 他的孙子的分类是3

这样孙子id的path就是 /1/2/3

查询的时候
select * from 表 where id in (
select id from 表 where path like '/1/%'


就能查到1下面的所以子孙分类。

而且根据path字段 split后 就能很方便的获取当前分类的层级路径。

如果你是在搜索引擎里。。id肯定不能分词。
你建的时候 用 id 空格 id 空格 id表示path。


这个很好啊,谢谢啦,但是类别一旦更改要如何改变呢,比如,以前的一个类要细分成3个,有没有什么方便的方案,谢谢,改完就得重建索引?
0 请登录后投票
   发表时间:2012-10-15  
要考虑会动态删除中间一个节点,
0 请登录后投票
   发表时间:2012-10-16  
    我们之前是根据数据库建表进行分类查询的

  总分类表
    ||
   分类表

在分类表建立索引
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics