找人做网站设计 哪个平台可以找,惠州网站建设熊掌号,泉州seo排名扣费,航空港建设局网站目录 Lucene.net站内搜索—1、SEO优化 Lucene.net站内搜索—2、Lucene.Net简介和分词 Lucene.net站内搜索—3、最简单搜索引擎代码Lucene.net站内搜索—4、搜索引擎第一版技术储备#xff08;简单介绍Log4Net、生产者消费者模式#xff09;Lucene.net站内搜索—5、搜索引擎第… 目录 Lucene.net站内搜索—1、SEO优化 Lucene.net站内搜索—2、Lucene.Net简介和分词 Lucene.net站内搜索—3、最简单搜索引擎代码Lucene.net站内搜索—4、搜索引擎第一版技术储备简单介绍Log4Net、生产者消费者模式Lucene.net站内搜索—5、搜索引擎第一版实现Lucene.net站内搜索—6、站内搜索第二版 站内搜索模块生产者、消费者多线程。复习多线程用多线程做一个winform的生产者、消费者的例子有任务的时候点按钮给整数就处理任务没任务的时候就每次扫描都说“还是没任务睡会再看”用Sleep模拟耗时操作线程中操作UI线程的代码见备注。 派一个人来管理索引库想向索引库中写数据的地方都向这个人来发出请求。 由于索引库同时只能有一个IndexWriter进行写所以有一个消费者线程一直保持对IndexWriter写的状态有新任务进入的时候对IndexWriter写入。如果IndexWriter一直保持打开状态的话新添加的文档是不会被搜索到的因此必须处理完队列中的任务后关闭writer然后下次while循环扫描的时候判断如果队列汇总没有任务则sleep5秒钟后再判断防止不断判断给服务器cpu压力 IndexManager做成单例。维持一个任务的QueueThread thread new Thread(ScanThread); thread.Start();启动一个线程在ScanThread方法中不断遍历Queue 当有新任务加入的时候把新任务加入索引库当要删除文章的时候也是加入一个jobType JobType.Delete的内容。UpdateDocument文章的更新和删除。1、线程访问UI线程 ParameterizedThreadStart threadStart (obj) {txtLog.AppendText(obj \n);};txtLog.Invoke(threadStart, item); 详细代码如下 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Threading;
using log4net;
using System.Configuration;
using System.Web.Hosting;
using RuPeng.Utils;
using RuPengSite.DataTier.DataSetThreadTableAdapters;
using System.Text;
using Lucene.Net.Store;
using Lucene.Net.Index;
using System.IO;
using Lucene.Net.Analysis.PanGu;
using Lucene.Net.Documents;
namespace RuPengSite.Search
{public class IndexManager{public readonly static IndexManager Instance new IndexManager();private HashSetIndexJobItem jobs new HashSetIndexJobItem();//任务的集合private bool isStopped;//任务是否停止private static ILog log LogManager.GetLogger(typeof(IndexManager));private IndexManager(){ }//启动任务public void Start(){isStopped false;Thread thread new Thread(ScanThread);thread.Start(); }//停止任务public void Stop(){isStopped true;}/// summary/// 扫描线程/// /summaryprivate void ScanThread(){//如果停止则不再无限循环while (!isStopped){Thread.Sleep(5000);//休息5秒钟尽可能多的累积任务if (jobs.Count 0){continue;//如果没任务继续睡}log.Debug(开始索引预处理);string indexPath SearchHelper.GetSearchIndexFullPath();log.Debug(索引路径是 indexPath);FSDirectory directory FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());//判断索引目录是否已经存在bool isUpdate IndexReader.IndexExists(directory);log.Debug(索引路径存在状态是 isUpdate);if (isUpdate){//如果索引目录被锁定比如索引过程中程序异常退出则首先解锁if (IndexWriter.IsLocked(directory)){log.Debug(开始解锁索引路径);IndexWriter.Unlock(directory);}}IndexWriter writer new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);try{ProcessJobItems(directory, writer);}finally{log.Debug(开始关闭reader、writer);writer.Close();directory.Close();log.Debug(完成关闭reader、writer);} }}/// summary/// 处理队列中的任务/// /summary/// param namedirectory/param/// param namewriter/paramprivate void ProcessJobItems(FSDirectory directory, IndexWriter writer){log.Debug(开始处理队列中的jobs.Count个任务);foreach (var jobItem in jobs.ToArray())//转换为数组避免读的时候不能修改的问题{try{ProcessJobItem(writer, jobItem);jobs.Remove(jobItem);//将处理完成的任务移除}catch (Exception ex){log.Error(对任务进行处理失败 jobItem, ex);} }log.Debug(队列中的任务处理完毕);}private static void ProcessJobItem(IndexWriter writer, IndexJobItem jobItem){long threadId jobItem.ThreadId;JobType jobType jobItem.ItemType;string url SearchHelper.GetThreadUrl(threadId);if (jobType JobType.Delete)//判断任务的类型{log.Debug(将帖子从索引中移除,threadId threadId);writer.DeleteDocuments(new Term(SearchHelper.URL, url));//删除旧的收录}else if (jobType JobType.Add){writer.DeleteDocuments(new Term(SearchHelper.URL, url));//删除旧的收录var threads new rp_threadsTableAdapter().GetDataById(threadId);if (threads.Count 0){log.Debug(id为threadId的帖子不存在);return;}string body SearchHelper.GetThreadContent(threadId);//帖子内容string title threads.Single().Subject;//主题Document document new Document();document.Add(new Field(SearchHelper.URL, url, Field.Store.YES, Field.Index.NOT_ANALYZED));document.Add(new Field(SearchHelper.TITLE, title, Field.Store.YES, Field.Index.NOT_ANALYZED));document.Add(new Field(SearchHelper.BODY, body, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));writer.AddDocument(document);log.Debug(索引帖子 threadId完成);}else{throw new Exception(错误的jobType jobType);}}/// summary/// 添加帖子的索引任务/// /summary/// param namethreadId/parampublic void AddThread(long threadId){IndexJobItem jobItem new IndexJobItem() { ItemTypeJobType.Add,ThreadIdthreadId};jobs.Add(jobItem);}/// summary/// 移除帖子的索引任务/// /summary/// param namethreadId/parampublic void DeleteThread(long threadId){IndexJobItem jobItem new IndexJobItem() { ItemType JobType.Delete, ThreadId threadId };jobs.Add(jobItem);}class IndexJobItem{public JobType ItemType { get; set; }public long ThreadId { get; set; }public override bool Equals(object obj){IndexJobItem item obj as IndexJobItem;if (item null){return false;}return this.ItemTypeitem.ItemTypethis.ThreadIditem.ThreadId;}public override int GetHashCode(){return ToString().GetHashCode();}public override string ToString(){return ItemType:ThreadId;}}enum JobType {Delete,Add }//任务类型}
} 多条件查询 我看了下淘宝淘宝的站内搜索只实现了且条件 或条件查询可以来看看百度当然百度是同时采用了且条件和或条件查询的 在标题和正文中查找 PhraseQuery queryMsg new PhraseQuery();foreach (string word in CommonHelper.SplitWords(txtKW.Text)){queryMsg.Add(new Term(msg, word));}queryMsg.SetSlop(100);
PhraseQuery queryTitle new PhraseQuery();foreach (string word in CommonHelper.SplitWords(txtKW.Text)){queryTitle.Add(new Term(title, word));}queryTitle.SetSlop(100);
BooleanQuery query new BooleanQuery();query.Add(queryMsg, BooleanClause.Occur.SHOULD);
query.Add(queryTitle, BooleanClause.Occur.SHOULD); BooleanQuery相当于盛放其他查询条件的容器类似于div。第二个参数Must为必须有Must_Not为必须没有Should为可以有 高亮显示 高亮显示只显示包含关键词的部分。参考盘古分词的文档。从网上、文档找来的代码不用细读每行代码先把它拿过来运行通过再说。不用每次改代码都重启在项目的属性页面的Web中选中“启用编辑并继续Enable Edit and Continue”把font控制颜色改成通过style控制颜色原则“不要在正文中控制格式”。不推荐使用font、b、i、br等。 private static String highLight(string keyword,String content){PanGu.HighLight.SimpleHTMLFormatter formatter new PanGu.HighLight.SimpleHTMLFormatter(font colorred, /font);PanGu.HighLight.Highlighter highlighter new PanGu.HighLight.Highlighter(formatter, new Segment());highlighter.FragmentSize 500;string msg highlighter.GetBestFragment(keyword,content);if (string.IsNullOrEmpty(msg)){return content;}else{return msg;}}String hightlightTitle highLight(keyword, title);String hightlightBody HttpUtility.HtmlEncode(body);//防止XSS攻击hightlightBody highLight(keyword, hightlightBody); 路径可配置化 连接配置信息放到Web.Config的ConnectionStrings段中而普通的自定义配置则可以写到AppSettings段中哪些需要配置索引的路径被索引的网站url索引的时间间隔。读取string indexPath ConfigurationManager.AppSettings[IndexPath]使用ConfigurationManager添加引用System.Configuration使用request.MapPath或者Server.MapPath把相对于网站根路径的路径转换为绝对路径不是转换为http://www.baidu.com/a.aspx转换为c:/baidu_com/a.aspx。在定时任务等不在Http线程中取HttpContext.Current得到的是null因此在定时任务中不能用HttpContext.Current.Server.MapPath方法来转换要用HostingEnvironment.MapPath因此可以在其他地方也用HostingEnvironment.MapPath。修改Web.config会造成IIS重启这样会立即加载新的任务解决地址无法发给好友 我们先看下淘宝的站内搜索 细心看我们会发现url是一连串的字符串可以肯定这是采用了get请求的方式。 用户没法把搜索结果页面发给好友要用Get提交这样才能得到搜索页面地址。如果采用Get方式的话要删掉form的runatserver变成HTML的form、method改为get所有控件都要用HTML控件。因为只有去掉runatserver的form才会完全去掉ViewState注意input不能只指定id而应该指定name否则不会出现在querystring中。Id是供Javascript用的name是供querystring/Request用的。对于typesubmit的input来说只有被点击的input的name、value才会被提交给服务器。method改为get1、要删掉form的runatserver。唯一去掉viewstate的方法2、所有除了DataBound控件比如GridView、Repeater等都要用HTML控件。Repeater、ObjectDataSource之类控件不需要runatserver的form也可以但是VS总是提示去源代码视图拖放、让他生成再手动删掉。3、控件注意要给表单name属性赋值。4、在后台Page_Load代码中进行响应5、IsPostBack不再有用只能通过判断参数是否为空来判断是否是提交的页面。点搜索按钮以后如何显示搜索关键字在aspx.cs中定义一个GetKeyWord方法input typetext idkw1 namekw value%Request[kw] %/只要有runatserver的form就会产生__VIEWSTATE等所以去掉form的runatserver这样除了Repeater等少数控件之外服务端控件都没法使用只能使用html标签。这是为什么说“要求高的互联网项目不用服务端控件”。面试时候说我在有的项目中没有用服务端控件的例子。 为了能让查询参数显示在地址栏中方便传播地址把form的method改为get因为ViewState太长所以影响美观因此禁用ViewState但是发现哪怕禁用ViewStateViewState也没有完全消失研究发现只有去掉form的runatserver后才能完全干掉ViewState但是一旦去掉form的runatserver后几乎所有的WebForm控件都用不了除了Repeater等少数几个和input无关的之外只能用html控件然后在Page_Load中进行响应。 转载于:https://www.cnblogs.com/jiekzou/p/4381649.html