• Lucene.NET入门实例


    今天从网上找了一些关于Lucene.NET的资料,自己做个demo测试了一下。

    Lucene.NET 是开源的项目,从网上很容易找到源代码,新建一个web测试页面和一个控制台程序,控制台程序用来创建lucene的索引

    控制台代码如下:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Lucene.Net.Analysis.Standard;
    using Lucene.Net.Analysis;
    using Lucene.Net.Index;
    using Lucene.Net.Documents;
    using System.IO;
    using Lucene.Net.Analysis.Cn;
    using Lucene.Net.Analysis.CJK;
    using System.Data.SqlClient;
    using System.Data;
    namespace Test
    {
        
    class TokenizerTest
        {
            
    public static string connstr = "server=.;database=test;uid=sa;pwd=";

            
    public static SqlConnection mycon;
            
    static void Main(string[] args)
            {
                SqlDataReader myred 
    = OpenTable();

                IndexWriter writer 
    = CreateIndex(myred);
                Console.WriteLine(
    "索引创建完成");
                Console.Read();
            }
            
    public static SqlDataReader OpenTable()
            {

                mycon 
    = new SqlConnection(connstr);
                mycon.Open();
                SqlCommand mycom 
    = new SqlCommand("select * from Article", mycon);
                DataTable tb 
    = new DataTable();
                SqlDataAdapter adp 
    = new SqlDataAdapter(mycom);
                adp.Fill(tb);
                DataTable d 
    = tb;
                
    return mycom.ExecuteReader();

            }

            
    //对数据库中的字段建立索引

            
    public static IndexWriter CreateIndex(SqlDataReader myred)
            {

                IndexWriter writer 
    = new IndexWriter("D:/index/"new ChineseAnalyzer(), true);   //索引的存储位置

                
    try
                {

                    
    while (myred.Read())
                    {

                        Document doc 
    = new Document();

                        doc.Add(
    new Field("id", myred["id"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));

                        doc.Add(
    new Field("title", myred["title"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));

                        doc.Add(
    new Field("summary", myred["summary"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));

                        writer.AddDocument(doc);

                    }

                    writer.Optimize(); 
    //优化索引

                    writer.Close();

                    myred.Close();

                }

                
    catch (Exception e)
                {

                    
    //Response.Write(e);

                    myred.Close();

                }

                
    return writer;

            }
        }

    } 

    创建好索引之后,就可以使用了测试页面代码:

    protected void Search_Click(object sender, EventArgs e)
        {
            DataRow dr;
            DataTable luctb 
    = new DataTable();
            luctb.Columns.Add(
    "id");
            luctb.Columns.Add(
    "title");
            luctb.Columns.Add(
    "summary");
            Stopwatch sw 
    = new Stopwatch();
            sw.Start();
            Hits myhit 
    = seacher(this.tj.Text.Trim());

            
    for (int i = 0; i < myhit.Length(); i++)
            {

                Document doc 
    = myhit.Doc(i);

                dr 
    = luctb.NewRow();

                dr[
    0= doc.Get("id").ToString();

                dr[
    1= doc.Get("title").ToString();

                dr[
    2= doc.Get("summary").ToString();

                luctb.Rows.Add(dr);

                dr.AcceptChanges();

            }
            sw.Stop();
            
    this.Label1.Text = "" + luctb.Rows.Count + "" + sw.ElapsedMilliseconds.ToString();
            
    this.gview.DataSource = luctb;

            
    this.gview.DataBind();
            DataTable sqltb 
    = new DataTable();

            mycon 
    = new SqlConnection(connstr);
            mycon.Open();
            Stopwatch swsql 
    = new Stopwatch();
            swsql.Start();
            SqlCommand mycom 
    = new SqlCommand(string.Format("select Id,title,summary from Article where summary like '%{0}%' or title like '%{0}%'"this.tj.Text.Trim()), mycon);
            DataTable tb 
    = new DataTable();
            SqlDataAdapter adp 
    = new SqlDataAdapter(mycom);
            adp.Fill(tb);
            swsql.Stop();
            
    this.Label2.Text = "" + tb.Rows.Count + "" + swsql.ElapsedMilliseconds.ToString();
            
    this.gviewsql.DataSource = tb;

            
    this.gviewsql.DataBind();

        }

    代码中分别利用lucene和sql语句从Article查询title和summary两个字段中包含要查询字符的记录。表中共20w+条数据,

     测试结果:lucene耗时:共35行16毫秒sql耗时:共35行2331毫秒

  • 相关阅读:
    依赖注入模式与反模式
    WPF异常——某个ItemsControl与它的项源不一致
    C# 3进化的数据访问之智能的编译器
    C# 2的重大改进之可空类型
    C# 1之外:构建于坚实基础上的新特性
    C# 1的核心基础之二——类型系统
    C# 1的核心基础之一——委托
    C#进化史
    单一职责原则
    HBase简介
  • 原文地址:https://www.cnblogs.com/dlz1123/p/1963996.html
Copyright © 2020-2023  润新知