B2C商城关键技术点总结(站内搜索、定时任务)
1.站内搜索
1.1Lucene.Net建立信息索引
string indexPath = @"E:\xxx\xxx";//索引保存路径
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
bool isUpdate = IndexReader.IndexExists(directory);
if (isUpdate)
{
//如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED); for (int i = ; i <= ; i++)
{
//因为从服务器下载页面有可能失败,为了避免失败时程序终止,所以要处理异常,写入日志
//这里能预知的异常是服务器下载失败异常,WebException
try
{
WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
string url = "http://localhost:3448/Book.aspx?id=" + i;
string html = wc.DownloadString(url); HTMLDocumentClass htmlDoc = new HTMLDocumentClass();
htmlDoc.designMode = "on"; //不让解析引擎去尝试运行javascript
htmlDoc.IHTMLDocument2_write(html);
htmlDoc.close(); string title = htmlDoc.title;
string content = "";
if (htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent") != null)
{
if (htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent").innerText != null)
{
content = htmlDoc.getElementById("ctl00_ContentPlaceHolder1_DetailsView1_txtContent").innerText;
}
}
//为避免重复索引,所以要先删除"url"=url的记录,再重新添加
writer.DeleteDocuments(new Term("url", url)); Document document = new Document();
document.Add(new Field("url", url, Field.Store.YES, Field.Index.NOT_ANALYZED));
document.Add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(document); logger.Debug("索引" + i + "完毕");
}
catch (WebException webe)
{
logger.Error(webe.Message);
}
}
writer.Close();
directory.Close();//不要忘了Close,否则索引结果搜不到
logger.Debug("全部索引完毕");
1.2盘古分词并高亮
public List<SearchContentResult> GetSearchContentResult(string kw, int startIndex,int pageSize, out int count)
{
string indexPath = @"E:xxx\xxx\index";
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
IndexSearcher searcher = new IndexSearcher(reader); //将用户搜索的关键字进行分词
string[] strs = CommonHelper.FenCi(kw.ToLower());
PhraseQuery query = new PhraseQuery();
foreach (string str in strs)
{
query.Add(new Term("content", str));
}
query.SetSlop(); TopScoreDocCollector collector = TopScoreDocCollector.create(, true);
searcher.Search(query, null, collector);
count = collector.GetTotalHits();
ScoreDoc[] docs = collector.TopDocs(startIndex,pageSize).scoreDocs;
List<SearchContentResult> scs = new List<SearchContentResult>();
for (int i = ; i < docs.Length; i++)
{
int docId = docs[i].doc;
Document doc = searcher.Doc(docId);
SearchContentResult sc = new SearchContentResult();
sc.Url = doc.Get("url");
sc.Title = doc.Get("title");
sc.Body = highLight(kw, doc.Get("content"));
scs.Add(sc);
}
return scs;
} private static String highLight(string keyword, String content)
{
PanGu.HighLight.SimpleHTMLFormatter formatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color='red'>", "</font>");
PanGu.HighLight.Highlighter highlighter = new PanGu.HighLight.Highlighter(formatter, new Segment());
highlighter.FragmentSize = ;
string msg = highlighter.GetBestFragment(keyword, content);
if (string.IsNullOrEmpty(msg))
{
return content;
}
else
{
return msg;
}
}
2.Quartz.Net定时任务
在Global类中声明一个静态变量
static IScheduler sched;
保证其在系统中是唯一的
//建立一个Quartz任务
ISchedulerFactory sf = new StdSchedulerFactory();
sched = sf.GetScheduler();
JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob));//IndexJob为实现了IJob接口的类 Trigger trigger = TriggerUtils.MakeDailyTrigger("trigger", , );
trigger.JobGroup = "group1";
trigger.JobName = "job1"; sched.AddJob(job, true);
sched.ScheduleJob(trigger);
sched.Start();
添加任务类,并继承接口
public class IndexJob : IJob
{
private static ILog logger = LogManager.GetLogger(typeof(IndexJob));
public void Execute(JobExecutionContext context)
{
//此处写执行的代码
}
}
B2C商城关键技术点总结(站内搜索、定时任务)的更多相关文章
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—1、SEO优化
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- Lucene.net站内搜索—6、站内搜索第二版
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—5、搜索引擎第一版实现
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—3、最简单搜索引擎代码
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—2、Lucene.Net简介和分词
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- 完整的站内搜索Demo(Lucene.Net+盘古分词)
前言 首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 很多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索“.n ...
- 完整的站内搜索实战应用(Lucene.Net+盘古分词)
首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索". ...
随机推荐
- kvm虚拟化关闭虚拟网卡virbr0的方法
我们知道:kvm虚拟化环境安装好后,ifconfig会发现多了一个虚拟网卡virbr0这是由于安装和启用了libvirt服务后生成的,libvirt在服务器(host)上生成一个 virtual ne ...
- OSGB数据压缩
OSGB数据输出时压缩数据大小,采用如下设置 osgDB::writeNodeFile(*osgbNode, "xxx/xxxx.osgb", new osgDB::Options ...
- QT下opencv的编译和使用
需要的文件 qt-opensource-windows-x86-mingw491_opengl-5.4.0.exe cmake-3.12.0-rc1-win64-x64.msi opencv-2.4. ...
- css3-弹性盒模型
first <style> .box{width:1024px;height:100px; border:5px solid black; padding:10px; display:-w ...
- 转:为Docker容器设置固定IP实现网络联通(1)——通过Pipework为Docker容器设置
https://blog.csdn.net/chinagissoft/article/details/51250839 1. 创建并启动一个容器: docker run --cap-add=NET_A ...
- css 按钮凹陷的感觉
.login-btn{ margin-top: 60rpx !important; background-color:transparent !important; width: 40%; margi ...
- scipy插值interpolation
>>> from scipy.interpolate import interp1d#interp1d表示1维插值 >>> >>> x = np. ...
- 关于python项目路径导入自己写的库出错的一点思考
其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下. 这个项目的顶级目录是medivac,他本身是一个python模块. 熟悉flask的人都知道,在 ...
- PostgreSQL之Sequence序列(转)
本文转载自:https://blog.csdn.net/omelon1/article/details/78798961 Sequence序列 Sequence是一种自动增加的数字序列,一般作为行或者 ...
- Python连接字符串用join还是+
我们先来看一下用join和+连接字符串的例子 str1 = " ".join(["hello", "world"]) str2 = &quo ...