天天看點

asp.net中利用Lucene.net實作檢索并對檢索關鍵字高亮顯示

 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;

}