为了方便的学习站内搜索,下面我来演示一个MVC项目。

1.首先在项目中【添加引入】三个程序集和【Dict】文件夹,并新建一个【分词内容存放目录】

Lucene.Net.dll、PanGu.dll、PanGu.Lucene.Analyzer.dll

链接:http://pan.baidu.com/s/1eS6W8s6 密码:ds8b

链接:链接:http://pan.baidu.com/s/1geYyDnt 密码:8rq4

2.建立Search控制器,并转到Index界面写入如下内容:

PS:VS有问题,波浪号由他去吧,,,

----------后台语句-------

->创建索引语句

  1. public ActionResult SearchContent()
  2. {
  3. //首先根据name区分是点击的哪个按钮
  4. if (!String.IsNullOrEmpty(Request.Form["btnSearch"]))//执行搜索
  5. {
  6.  
  7. }
  8. else//创建索引
  9. {
  10. CreateSearchIndex();//调用创建索引语句
  11. }
  12. return Content("OK");
  13. }
  14. //创建索引语句
  15. public void CreateSearchIndex()
  16. {
  17. string indexPath = @"H:\lucenedir";//注意和磁盘上文件夹的大小写一致,否则会报错。将创建的分词内容放在该目录下
  18. FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
  19. bool isUpdate = IndexReader.IndexExists(directory);//判断索引库是否存在
  20. if (isUpdate)
  21. {
  22. //如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁
  23. //Lucene.Net在写索引库之前会自动加锁,在close的时候会自动解锁
  24. //不能多线程执行,只能处理意外被永远锁定的情况
  25. if (IndexWriter.IsLocked(directory))
  26. {
  27. IndexWriter.Unlock(directory);//un-否定。强制解锁
  28. }
  29. }
  30. IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
  31. //-------调用业务层拿到所有的数据
  32. Search.BLL.UserGUIDBll bll = new Search.BLL.UserGUIDBll();
  33. List<Search.Model.UserInfo> list=bll.SelectAll();
  34. foreach (UserInfo item in list)
  35. {
  36. Document document = new Document();//一条Document相当于一条记录
  37. document.Add(new Field("id",item.UserId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));//每个Document可以有自己的属性(字段),所有字段名都是自定义的,值都是string类型
  38. //想给用户展示什么就往词库里面添加什么
  39. document.Add(new Field("title",item.UserName, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
  40. document.Add(new Field("content", item.UserContent, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
  41. writer.AddDocument(document);
  42.  
  43. }
  44. writer.Close();//会自动解锁
  45. directory.Close();//不要忘了Close,否则索引结果搜不到
  46. }

  执行创建索引语句,将看到分词内容文件夹里面将多一些东西,这些就是用来以后检索的

->执行索引语句

  1. public ActionResult SearchContent()
  2. {
  3. //首先根据name区分是点击的哪个按钮
  4. if (!String.IsNullOrEmpty(Request.Form["btnSearch"]))//执行搜索
  5. {
  6. List<ViewSearchContentModel> recList=SearchBookContent();
  7. ViewData["searchList"] = recList;
  8. return View("Index");
  9. }
  10. else//创建索引
  11. {
  12. CreateSearchIndex();//调用创建索引语句
  13.  
  14. }
  15. return Content("OK");
  16. }

SearchBookContent类:

  1. //执行索引语句
  2. public List<ViewSearchContentModel> SearchBookContent()
  3. {
  4. string indexPath = @"H:\lucenedir"; //lucene存数据的路径
  5. string searchTxt = Request.Form["txtContent"];//获取用户输入的内容
  6. //将用户输入的内容进行分词
  7. List<string> kw=SearchController.GetPanGuWord(searchTxt);
  8.  
  9. //string kw = "没有";
  10. FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
  11. IndexReader reader = IndexReader.Open(directory, true);
  12. IndexSearcher searcher = new IndexSearcher(reader);
  13. PhraseQuery query = new PhraseQuery();//查询条件
  14. //query.Add(new Term("msg", kw));//where contains("msg",kw) 这里的msg对应上面的msg
  15. foreach (string word in kw)//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
  16. {
  17. query.Add(new Term("content", word));//contains("msg",word)
  18. }
  19. query.SetSlop(100);//两个词的距离大于100(经验值)就不放入搜索结果,因为距离太远相关度就不高了
  20. TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);//盛放查询结果的容器
  21. searcher.Search(query, null, collector);//使用query这个查询条件进行搜索,搜索结果放入collector
  22. //collector.GetTotalHits()总的结果条数
  23. ScoreDoc[] docs = collector.TopDocs(0, collector.GetTotalHits()).scoreDocs;//从查询结果中取出第m条到第n条的数据
  24.  
  25. List<ViewSearchContentModel> list = new List<ViewSearchContentModel>();
  26. for (int i = 0; i < docs.Length; i++)//遍历查询结果
  27. {
  28. ViewSearchContentModel viewModel = new ViewSearchContentModel();
  29. int docId = docs[i].doc;//拿到文档的id。因为Document可能非常占内存(DataSet和DataReader的区别)
  30. //所以查询结果中只有id,具体内容需要二次查询
  31. Document doc = searcher.Doc(docId);//根据id查询内容。放进去的是Document,查出来的还是Document
  32. viewModel.Id = doc.Get("id");
  33. viewModel.Title = doc.Get("title");
  34. viewModel.Content = doc.Get("content");
  35. list.Add(viewModel);
  36. }
  37. return list;
  38.  
  39. }
  40. class SearchResult
  41. {
  42. public int Id { get; set; }
  43. public string Msg { get; set; }
  44. }
  45. //利用盘古分词对用户输入的内容进行分词
  46. public static List<string> GetPanGuWord(string str)
  47. {
  48. List<string> list=new List<string>();
  49. Analyzer analyzer = new PanGuAnalyzer();
  50. TokenStream tokenStream = analyzer.TokenStream("", new StringReader(str));
  51. Lucene.Net.Analysis.Token token = null;
  52. while ((token = tokenStream.Next()) != null)
  53. {
  54. list.Add(token.TermText());
  55. // Console.WriteLine(token.TermText());
  56. }
  57. return list;
  58. }

ViewSearchContentModel类:(这个类定义在MVC中的Model里面的,视图要展示啥数据,这里就定义什么)

  

->前台修改如下:

  1. <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4.  
  5. <html xmlns="http://www.w3.org/1999/xhtml" >
  6. <head runat="server">
  7. <title>文档搜索</title>
  8. </head>
  9. <body>
  10. <div>
  11. <form method="post" action="/Search/SearchContent">
  12. 请输入搜索的条件:<input type="text" name="txtContent" />
  13. <input type="submit" value="搜索" name="btnSearch"/>
  14. <input type="submit" value="创建索引库" name="btnCreate"/>
  15. </form>
  16. <table>
  17. <tbody>
  18. <%if (ViewData["searchList"] != null)
  19. {
  20. foreach (站内搜索2.Models.ViewSearchContentModel item in (List<站内搜索2.Models.ViewSearchContentModel>)ViewData["searchList"])
  21. {%>
  22. <tr><td><%=item.Id%></td><td><%=item.Title%></td><td><%=item.Content%></td></tr>
  23. <% }
  24.  
  25. }
  26. %>
  27. </tbody>
  28. </table>
  29.  
  30. </div>
  31. </body>
  32. </html>

-----这时基本搜索功能就实现了,接下来实现高亮显示-------

1.添加或引入PanGu.HighLight和PanGu.HighLight.pdb

链接:http://pan.baidu.com/s/1eS6W8s6 密码:ds8b

创建一个Common文件夹,并在里面建立一个WebCommon类

  

代码如下:(这个类中参数keyworkds就是要高亮显示的值,content就是返回的内容,这样在搜索结果中调用这个类就能实现高亮)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using PanGu.HighLight;
  6. using PanGu;
  7.  
  8. namespace 站内搜索2.Common
  9. {
  10. public class WebCommon
  11. {
  12. public static string CreateHighLight(string keywords, string content)
  13. {
  14. SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font style='color:red'>", "</font>");
  15. Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new Segment());
  16. //设置每个摘要的字符数
  17. highlighter.FragmentSize = 150;
  18. return highlighter.GetBestFragment(keywords, content);
  19. }
  20. }
  21. }

在搜索结果中调用这个类:

  1. // viewModel.Content = doc.Get("content");
  2. viewModel.Content = Common.WebCommon.CreateHighLight(Request["txtContent"], doc.Get("content"));

写到这先放张效果图吧:

注意:有的时候我们使用razor引擎,会发生自动编码问题,为了正常显示,我们可以这样写:@MVCHtmlString.Create(item.Title)

JS侧栏分享代码:

  1. <!-- JiaThis Button BEGIN -->
  2. <script type="text/javascript" src="http://v3.jiathis.com/code/jiathis_r.js?move=0&btn=r4.gif" charset="utf-8"></script>
  3. <!-- JiaThis Button END -->

最后再补充一下分词工具使用方式:

站内搜索源码下载:链接:http://pan.baidu.com/s/1o8IlAZK 密码:0gwf

站内搜索——Lucene +盘古分词的更多相关文章

  1. 完整的站内搜索Demo(Lucene.Net+盘古分词)

    前言 首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 很多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索“.n ...

  2. 完整的站内搜索实战应用(Lucene.Net+盘古分词)

    首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索". ...

  3. Lucene.net站内搜索—2、Lucene.Net简介和分词

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  4. Lucene.net站内搜索—5、搜索引擎第一版实现

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  5. Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  6. Lucene.net站内搜索—3、最简单搜索引擎代码

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  7. 使用Lucene.NET实现简单的站内搜索

    使用Lucene.NET实现简单的站内搜索 导入Lucene.NET 开发包 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  8. Lucene.Net 站内搜索

    Lucene.Net 站内搜索 一  全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们 ...

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

    Lucene.net是一个搜索引擎的框架,它自身并不能实现搜索.须要我们自己在当中实现索引的建立,索引的查找.全部这些都是依据它自身提供的API来实现.Lucene.net本身是基于java的,可是经 ...

随机推荐

  1. Docker是什么

    Docker是什么 相信我们很多人都使用多VM(Virtual Machine),也就是虚拟机,简单的来说Docker就是类是于VM的容器,但Docker要轻量得多,VM(Virtual Machin ...

  2. 一、Android学习第一天——环境搭建(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第一天——环境搭建 Android 开发环境的搭建 ...

  3. Assembly - Registers

    Processor operations mostly involve processing data. This data can be stored in memory and accessed ...

  4. Nova 操作汇总(限 libvirt 虚机) [Nova Operations Summary]

    本文梳理一下 Nova 主要操作的流程. 0. Nova REST-CLI-Horizon 操作对照表 Nova 基本的 CRUD 操作和 extensions: # 类别 Nova V2 REST ...

  5. KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

  6. POJ3636Nested Dolls[DP LIS]

    Nested Dolls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8323   Accepted: 2262 Desc ...

  7. Xbox Live会员身份:银会员和金会员

    推出Xbox360之后,微软重新设计了Xbox Live平台.新设计建立了两个等级的Xbox Live会员身份:银会员和金会员.

  8. Win7虚拟机无法打开内核设备:\\Global\\vmx86

    Win7虚拟机无法打开内核设备:\\Global\\vmx86 听语音 | 浏览:16844 | 更新:2014-07-21 11:21 | 标签:虚拟机 1 2 3 4 5 6 7 分步阅读 一键约 ...

  9. AngularJs 1.5 $location获取url参数

    地址:http://localhost/waservice.html?id=17 获取参数id的值 app.config(['$locationProvider', function ($locati ...

  10. MVC控制器总结

    1.特性 [AuthorizeFilter]  用于权限过滤 [HttpGet] [HttpPost] 2.参数 获取方法 public ActionResult void Get(int id){} ...