Lucene.NET是一個全文搜尋架構,而不是應用産品。
直接貼代碼了:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="xxjs.aspx.cs" Inherits="XXJS_xxjs" %>
<%@ Register assembly="AspNetPager" namespace="Wuqi.Webdiyer" tagprefix="webdiyer" %>
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<div style="height:40px">
<asp:Button ID="btnCreateIndex" Text="建立索引" runat="server" onclick="btnCreateIndex_Click" />
<asp:Label ID="lbStatus" runat="server"></asp:Label>
</div>
<table>
<tr>
<td><asp:TextBox ID="tbSearchContent" runat="server" Height="20px" Width="155px"></asp:TextBox></td>
<td><asp:Button ID="btnSearch" runat="server" Text="搜尋" onclick="btnSearch_Click"/></td>
</tr>
</table>
<div id="msg" runat="server" bordercolorlight="#99cc99"
bordercolordark="#669933" bgcolor="#dde3ce" style="background-color: #C0C0C0"></div>
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
Width="100%" GridLines="None" AllowPaging="true"
onpageindexchanging="GridView1_PageIndexChanging">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<table width="100%" border="0" align="center" cellpadding="5" cellspacing="1">
<tr>
<td bgcolor="#ffffff" >
<font size="2"><asp:HyperLink ID="HyperLink1" runat="server" Text='<%#Eval("标題") %>' NavigateUrl='<%#Eval("連結位址") %>'></asp:HyperLink></font>
</td>
</tr>
<td>
<font size="2"><%# this.getSubString(Eval("内容").ToString())%></font>
</td>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
</form>
</body>
</html>
----------------------------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Text;
using System.IO;
using System.Collections;
using USTC;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.QueryParsers;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Store;
using Lucene.Net.Highlight;
using Lucene.Net.Analysis;
public partial class XXJS_xxjs : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
//隻在畫面第一次讀取的時候取得資料
VSDataTable = new DataTable();
}
PageDataBind(); //綁定資料
}
protected void btnCreateIndex_Click(object sender, EventArgs e)
CreateIndex();
//建立索引
public IndexWriter CreateIndex()
string INDEX_STORE_PATH = Server.MapPath("index"); //INDEX_STORE_PATH 為索引存儲目錄
//IndexReader reader = IndexReader.Open(INDEX_STORE_PATH);
//Term term = new Term(field, key);
//reader.DeleteDocuments(term);
//reader.Close();
IndexWriter writer = null;
try
writer = new IndexWriter(INDEX_STORE_PATH, new StandardAnalyzer(), true);
DM dm = new DM();
string strSQL = "select c_title,c_text,c_url from v_searches";
DataSet ds = dm.getsql(strSQL);
//建立索引字段
foreach (DataRowView drv in ds.Tables[0].DefaultView)
{
Document doc = new Document();
doc.Add(new Field("标題", drv["c_title"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("内容", drv["c_text"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("連結位址", drv["c_url"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
doc.Add(new Field("标題及内容", drv["c_title"].ToString() + drv["c_text"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));//不存儲,索引,标題及内容實作了标題和内容的索引
writer.AddDocument(doc);
}
writer.Optimize();
writer.Close();
this.lbStatus.Text = "索引建立成功!";
catch
this.lbStatus.Text = "索引已經建立過,無需重新建立!";
return writer;
//資訊檢索
protected void btnSearch_Click(object sender, EventArgs e)
BindLuceneData();
public void BindLuceneData()
string INDEX_STORE_PATH = Server.MapPath("index");//INDEX_STORE_PATH 為索引存儲目錄
string keyword = tbSearchContent.Text; //搜尋關鍵字
if (keyword != "")
Hits myhit = null;
IndexSearcher mysea = new IndexSearcher(INDEX_STORE_PATH);
Analyzer analyzer = new StandardAnalyzer(); //定義分詞器
QueryParser q = new QueryParser("标題及内容", analyzer);
Query query1 = q.Parse(keyword);
//高亮顯示
BooleanQuery bquery = new BooleanQuery();
Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter("<font color=/"red/">", "</font>"), new QueryScorer(query1));//使用高亮關鍵字顯示替代關鍵字
highlighter.SetTextFragmenter(new SimpleFragmenter(100));
DateTime start = DateTime.Now;
myhit = mysea.Search(query1);
DateTime end = DateTime.Now;
long time = end.Millisecond - start.Millisecond;
this.msg.InnerHtml = "<font size=2 >關于 <b><font color=blue>" + keyword + "</font><b/> 共搜尋到<b><font color=red>" + myhit.Length() + "</font></b>個相關結果.搜尋耗時:<font color=red>" + time + "</font>毫秒.</font></br>";
if (myhit != null)
DataRow myrow;
DataTable mytab = new DataTable();
mytab.Columns.Add("标題");
mytab.Columns.Add("内容");
mytab.Columns.Add("連結位址");
mytab.Clear();
for (int i = 0; i < myhit.Length(); i++)
{
Document doc = myhit.Doc(i);
myrow = mytab.NewRow();
myrow[0] = doc.Get("标題").ToString();
myrow[1] = doc.Get("内容").ToString();
myrow[2] = doc.Get("連結位址").ToString();
Lucene.Net.Analysis.TokenStream titleStream = analyzer.TokenStream("标題", new System.IO.StringReader(doc.Get("标題").ToString()));
string titleResult = highlighter.GetBestFragments(titleStream, doc.Get("标題").ToString(), 0, "...");
Lucene.Net.Analysis.TokenStream contentStream = analyzer.TokenStream("内容", new System.IO.StringReader(doc.Get("内容").ToString()));
string contentResult = highlighter.GetBestFragments(contentStream, doc.Get("内容").ToString(), 0, "...");
if (!string.IsNullOrEmpty(titleResult))
{
myrow[0] = titleResult;
}
if (!string.IsNullOrEmpty(contentResult))
myrow[1] = contentResult;
mytab.Rows.Add(myrow);
myrow.AcceptChanges();
}
GridView1.DataSource = mytab;
GridView1.DataBind();
ViewState["MyDataTable"] = mytab;
else
Response.Write("Hits為空");
mysea.Close();
else
return;
//分頁事件
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
GridView1.DataSource = VSDataTable;
GridView1.PageIndex = e.NewPageIndex;
GridView1.DataBind();
/// <summary>
/// 存放在ViewState的DataTable
/// </summary>
private DataTable VSDataTable
get { return ViewState["MyDataTable"] as DataTable; }
set { ViewState["MyDataTable"] = value; }
/// 普通的綁定資料
private void PageDataBind()
/// 綁定資料加換頁
/// <param name="getPageIndex">新頁面Index</param>
private void PageDataBind(Int32 getPageIndex)
GridView1.PageIndex = getPageIndex;
public string getSubString(string str)
if (str.Length > 200)
str = str.Substring(0, 197)+" ...";
return str;
}