B2C商城关键技术点总结(站内搜索、定时任务)

1.站内搜索

1.1Lucene.Net建立信息索引  

 1             string indexPath = @"E:\xxx\xxx";//索引保存路径
 2             FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
 3             bool isUpdate = IndexReader.IndexExists(directory);
 4             if (isUpdate)
 5             {
 6                 //如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
 7                 if (IndexWriter.IsLocked(directory))
 8                 {
 9                     IndexWriter.Unlock(directory);
10                 }
11             }
12             IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
13
14             for (int i = 4939; i <= 6087; i++)
15             {
16                 //因为从服务器下载页面有可能失败,为了避免失败时程序终止,所以要处理异常,写入日志
17                 //这里能预知的异常是服务器下载失败异常,WebException
18                 try
19                 {
20                     WebClient wc = new WebClient();
21                     wc.Encoding = Encoding.UTF8;
22                     string url = "http://localhost:3448/Book.aspx?id=" + i;
23                     string html = wc.DownloadString(url);
24
25                     HTMLDocumentClass htmlDoc = new HTMLDocumentClass();
26                     htmlDoc.designMode = "on"; //不让解析引擎去尝试运行javascript
27                     htmlDoc.IHTMLDocument2_write(html);
28                     htmlDoc.close();
29
30                     string title = htmlDoc.title;
31                     string content = "";
32                     if (htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent") != null)
33                     {
34                         if (htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent").innerText != null)
35                         {
36                             content = htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent").innerText;
37                         }
38                     }
39                     //为避免重复索引,所以要先删除"url"=url的记录,再重新添加
40                     writer.DeleteDocuments(new Term("url", url));
41
42                     Document document = new Document();
43                     document.Add(new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED));
44                     document.Add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
45                     document.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
46                     writer.AddDocument(document);
47
48                     logger.Debug("索引" + i + "完毕");
49                 }
50                 catch (WebException webe)
51                 {
52                     logger.Error(webe.Message);
53                 }
54             }
55             writer.Close();
56             directory.Close();//不要忘了Close,否则索引结果搜不到
57             logger.Debug("全部索引完毕");            

1.2盘古分词并高亮

 1         public List<SearchContentResult> GetSearchContentResult(string kw, int startIndex,int pageSize,  out int count)
 2         {
 3             string indexPath = @"E:xxx\xxx\index";
 4             FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
 5             IndexReader reader = IndexReader.Open(directory, true);
 6             IndexSearcher searcher = new IndexSearcher(reader);
 7
 8             //将用户搜索的关键字进行分词
 9             string[] strs = CommonHelper.FenCi(kw.ToLower());
10             PhraseQuery query = new PhraseQuery();
11             foreach (string str in strs)
12             {
13                 query.Add(new Term("content", str));
14             }
15             query.SetSlop(100);
16
17             TopScoreDocCollector collector = TopScoreDocCollector.create(2000, true);
18             searcher.Search(query, null, collector);
19             count = collector.GetTotalHits();
20             ScoreDoc[] docs = collector.TopDocs(startIndex,pageSize).scoreDocs;
21             List<SearchContentResult> scs = new List<SearchContentResult>();
22             for (int i = 0; i < docs.Length; i++)
23             {
24                 int docId = docs[i].doc;
25                 Document doc = searcher.Doc(docId);
26                 SearchContentResult sc = new SearchContentResult();
27                 sc.Url = doc.Get("url");
28                 sc.Title = doc.Get("title");
29                 sc.Body = highLight(kw, doc.Get("content"));
30                 scs.Add(sc);
31             }
32             return scs;
33         }
34
35         private static String highLight(string keyword, String content)
36         {
37             PanGu.HighLight.SimpleHTMLFormatter formatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color=‘red‘>", "</font>");
38             PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(formatter, new Segment());
39             highlighter.FragmentSize = 500;
40             string msg = highlighter.GetBestFragment(keyword, content);
41             if (string.IsNullOrEmpty(msg))
42             {
43                 return content;
44             }
45             else
46             {
47                 return msg;
48             }
49         }

2.Quartz.Net定时任务

在Global类中声明一个静态变量

static IScheduler sched;

保证其在系统中是唯一的

 1             //建立一个Quartz任务
 2             ISchedulerFactory sf = new StdSchedulerFactory();
 3             sched = sf.GetScheduler();
 4             JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob));//IndexJob为实现了IJob接口的类
 5
 6             Trigger trigger = TriggerUtils.MakeDailyTrigger("trigger", 10, 46);
 7             trigger.JobGroup = "group1";
 8             trigger.JobName = "job1";
 9
10             sched.AddJob(job, true);
11             sched.ScheduleJob(trigger);
12             sched.Start();

添加任务类,并继承接口

1     public class IndexJob : IJob
2     {
3         private static ILog logger = LogManager.GetLogger(typeof(IndexJob));
4         public void Execute(JobExecutionContext context)
5         {
6             //此处写执行的代码
7         }
8     }
时间: 2024-10-13 19:21:47

B2C商城关键技术点总结(站内搜索、定时任务)的相关文章

Lucene.net站内搜索1——SEO优化简介

声明:在这里,所谈的一切关于SEO的技术主要针对于我们开发人员. SEO (搜索引擎优化) SEO(搜索引擎优化)的目的(很多人都是通过搜索引擎找到我们的网站)是让搜索引擎更多的收录网站的页面,让被收录页面的权重更靠前,让更多的人能够通过搜索引擎进入这个网站 原理:蜘蛛会定时抓取网站的内容,发现网站内容变化.发现新增内容就反映到搜索引擎中 蜘蛛(spider) 爬网站:就是向网站发http get请求的客户端. SEO(搜索引擎优化*):让网站排名靠前,让网站更多的页面被搜索引擎收录.链接(外链

PHP核心编程--站内搜索

一.         站内搜索 前台页面: 在index.php页面中添加一个表单,输入搜索框 后台页面: 将index.php另存为search.php 对于搜索的 分页关键代码: 高亮关键字 相关函数: 1)        Mysql_fetch_assoc, 2)        mysql_fetch_row 3)        mysql_fetch_array 4)        mysql_fetch_object(); 5)        mysql_num_rows($resul

一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)

前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客. 所以打算写个系类:<一步步搭建自己的博客> 一步步开发自己的博客  .NET版(1.页面布局.blog迁移.数据加载) 一步步开发自己的博客  .NET版(2.评论功能) 一步步开发自己的博客  .NET版(3.注册登录功能) 一步步开发自己

基于lucene.net 和ICTCLAS2014的站内搜索的实现1

Lucene.net是一个搜索引擎的框架,它自身并不能实现搜索,需要我们自己在其中实现索引的建立,索引的查找.所有这些都是根据它自身提供的API来实现.Lucene.net本身是基于java的,但是经过翻译成.ne版本的,可以在ASP.net中使用这个来实现站内搜索. 要实现基于汉语的搜索引擎,首先的要实现汉语的分词.目前网上大部分都是利用已经有的盘古分词来实现的分词系统,但是盘古分词效果不太好.在这里我把最新的ICTCLAS2014嵌入到Lucene.net中.Lucene.net中所有的分词

利用Solr服务建立的站内搜索雏形

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将"*:*"改写为"title:安徽",则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到

1.PHP站内搜索

PHP站内搜索:多关键字.加亮显示 1.SQL语句中的模糊查找 $sql = "SELECT * FROM `message` WHERE `content`like '%$k[0]%' and `content`like '%$k[0]%'"; 2.多个关键字搜索的原理和技巧 3.替换关键字高亮显示 $r[content] = preg_replace("/($_GET[key])/i", "<font color = red><b&g

利用Solr服务建立的站内搜索雏形---solr1

最近看完nutch后总感觉像好好捯饬下solr,上次看到老大给我展现了下站内搜索我便久久不能忘怀.总觉着之前搭建的nutch配上solr还是有点呆板,在nutch爬取的时候就建立索引到solr服务下,然后在solr的管理界面中选择query,比如在q选项框中将“*:*”改写为“title:安徽”,则在管理界面中就能看到搜索结果,可是这个与搜索引擎的感觉差远了,总感觉这些结果是被solr给套在他的管理界面中了,于是自己在网上搜索,也想整个站内搜索一样的东西,就算整不到那么炫,只要整到在solr的管

基于lucene.net 和ICTCLAS2014的站内搜索的实现2

分词系统建立完毕,这是基础也是核心,后面我们建立索引要用到分词系统. 下面依次讲解索引的建立,索引的查找. 分词系统建立完毕,这是基础也是核心,后面我们建立索引要用到分词系统.下面依次讲解索引的建立,索引的查找. 索引的建立采用的是倒排序,原理就是遍历所有的文本,对其进行分词,然后把分的词汇建立索引表.形式类似如下: 词汇          出现词汇的篇章1,篇章2,篇章3-- 建立索引的时候要注意这样的Document,Field这俩术语.Document代表的是一个文档,它里面包含一个或者多

Lucene.Net 站内搜索

Lucene.Net 站内搜索 一  全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们存数据取数据,并没有界面,可以看作一个数据库,只能对文本信息进行检索)Lucene.Net原理:把文本切词保存,然后根据词汇表的页来找到文章 二  分词算法: //一元分词算法(引用Lucene.Net.dll)  一元分词算法 //二元分词算法(CJK:China Japan Korean 需要再