我来做百科(第二十天) A
不知道过了多少天了,凑个整的二十好了。下面写写这段时间的进展吧。
上一次写到完成基本的词条管理,内容管理,会员管理,评论管理,接着我做了tag系统。tag系统分了两个表,一个记录tag的内容,一个记录tag和内容的关联。这样的好处是容易处理,也更符合范式(不知有没有说错)。后台管理也不难做。难做的是tag的搜索系统,因为我想做成百度百科那样可以tag和关键字一起查找,还可以多个tag的“和”跟“或”查找。这个就要花点心思了,首先是判断查找的方式,接着是数据库怎么根据tag查找。查找方式我用“&”和“|”分开,数据库的查找就要想想了。我的设计是:第一步根据tag找到关联内容再找到关联词条,获取相关词条id,第二步筛选词条id,如果是“|”就不用筛选把重复的id移除就可以,“&”的话就是重复的id才留下。
我想既然我用了“&”和“|”作为搜索判断符号,那我添加tag时就必须对这两个符号过滤,反正要过滤就把所有的符号也过滤掉吧,安心。但我看百度百科好像没有过滤符号的,于是我在百度百科添加了一个带“&”的tag看会怎样,结果搜索时果然出问题,想不到百度会没留意这个bug。
我自己也测试一下:
tag:鳙鱼|海豚 成功!
tag:地理&珠三角 成功!
再做一个tag列表页面,这样tag系统就基本完成了。
上一次写到完成基本的词条管理,内容管理,会员管理,评论管理,接着我做了tag系统。tag系统分了两个表,一个记录tag的内容,一个记录tag和内容的关联。这样的好处是容易处理,也更符合范式(不知有没有说错)。后台管理也不难做。难做的是tag的搜索系统,因为我想做成百度百科那样可以tag和关键字一起查找,还可以多个tag的“和”跟“或”查找。这个就要花点心思了,首先是判断查找的方式,接着是数据库怎么根据tag查找。查找方式我用“&”和“|”分开,数据库的查找就要想想了。我的设计是:第一步根据tag找到关联内容再找到关联词条,获取相关词条id,第二步筛选词条id,如果是“|”就不用筛选把重复的id移除就可以,“&”的话就是重复的id才留下。
Tag t = new Tag();
string[] arrTag;
if (tag.Contains("&"))
{
arrTag = Function.GetDistinctStringArray(tag.Replace("&", " "));
if (arrTag != null)
{
List<int> lTag = new List<int>();
int i = 0;
foreach (string s in arrTag)
{
if (i++ == 0)
{
lTag.AddRange(t.GetTagLemmaByName(s));
}
else
{
List<int> lTemp = new List<int>();
foreach (int id in t.GetTagLemmaByName(s))
{
if (lTag.Contains(id))
{
lTemp.Add(id);
}
}
lTag = lTemp;
}
}
arrLemma = lTag.ToArray();
}
}
else
{
arrTag = Function.GetDistinctStringArray(tag.Replace("|", " "));
if (arrTag != null)
{
List<int> lTag = new List<int>();
foreach (string s in arrTag)
{
lTag.AddRange(t.GetTagLemmaByName(s));
}
arrLemma = lTag.ToArray();
}
}
string[] arrTag;
if (tag.Contains("&"))
{
arrTag = Function.GetDistinctStringArray(tag.Replace("&", " "));
if (arrTag != null)
{
List<int> lTag = new List<int>();
int i = 0;
foreach (string s in arrTag)
{
if (i++ == 0)
{
lTag.AddRange(t.GetTagLemmaByName(s));
}
else
{
List<int> lTemp = new List<int>();
foreach (int id in t.GetTagLemmaByName(s))
{
if (lTag.Contains(id))
{
lTemp.Add(id);
}
}
lTag = lTemp;
}
}
arrLemma = lTag.ToArray();
}
}
else
{
arrTag = Function.GetDistinctStringArray(tag.Replace("|", " "));
if (arrTag != null)
{
List<int> lTag = new List<int>();
foreach (string s in arrTag)
{
lTag.AddRange(t.GetTagLemmaByName(s));
}
arrLemma = lTag.ToArray();
}
}
我想既然我用了“&”和“|”作为搜索判断符号,那我添加tag时就必须对这两个符号过滤,反正要过滤就把所有的符号也过滤掉吧,安心。但我看百度百科好像没有过滤符号的,于是我在百度百科添加了一个带“&”的tag看会怎样,结果搜索时果然出问题,想不到百度会没留意这个bug。
我自己也测试一下:
tag:鳙鱼|海豚 成功!
tag:地理&珠三角 成功!
再做一个tag列表页面,这样tag系统就基本完成了。
转载请注明出处:http://www.cnblogs.com/cloudgamer/
如有任何建议或疑问,欢迎留言讨论。
如果觉得文章不错的话,欢迎点一下右下角的推荐。
程序中包含的js工具库CJL.0.1.min.js,原文在这里。