用Lucene.net如何实现高性能读写的方法实例

Lucene.net介绍

Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。开发人员可以基于Lucene.net实现全文检索的功能。

Lucene.net是Apache软件基金会赞助的开源项目,基于Apache License协议。

Lucene.net并不是一个爬行搜索引擎,也不会自动地索引内容。我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene.net索引中。标准的步骤是先初始化一个Analyzer、打开一个IndexWriter、然后再将文档一个接一个地加进去。一旦完成这些步骤,索引就可以在关闭前得到优化,同时所做的改变也会生效。这个过程可能比开发者习惯的方式更加手工化一些,但却在数据的索引上给予你更多的灵活性,而且其效率也很高。

lucene个人认为简单理解就是一个文本类数据库,想要查询肯定要先创建出一个数据库

1、创建lucene,创建前需要创建数据库及表,我现在是测试环境所以只创建了以下三列。

 代码如下 复制代码
id int
 title nvarchar(50)
 description nvarchar(200)
/// <summary>
/// 查询FilmTab所有信息
/// </summary>
/// <returns></returns>
public static DataTable FindFilmTabAll(string id)
{
    string where = " where 1=1 ";
    if (!string.IsNullOrEmpty(id))
    {
        where += " and id="+id;
    }
    string sql = "select id,title,description from FilmTbl" + where;
    return BaseInfoDB.GetTable(sql);
}
 
/// <summary>
/// 创建索引
/// </summary>
/// <param name="list">商品集合</param>
public static void CreateIndex(DataTable dt, string id)
{
    if (!System.IO.Directory.Exists(LucenePath))
    {
    System.IO.Directory.CreateDirectory(LucenePath);
    }
    //建立分子器
    Analyzer analyzer = new StandardAnalyzer();
    bool iscreate = string.IsNullOrEmpty(id) ? true : false;//这里很重要哦,lucene默认是生成全部,但是不能填加一条数据也要生成全部吧???所以如果只是更新该参数就是false(不创建
 
全部)
    IndexWriter indexwriter = new IndexWriter(LucenePath, analyzer, iscreate);
    for (int i = 0, count = dt.Rows.Count; i < count; i++)
    {
 
    Document document = new Document();//创建一行数据,和datarow是相同意思
    string Fieldid = dt.Rows[i]["id"].ToString();
    St.WriteTextToFile("时间:" + DateTime.Now + ",ID:" + Fieldid + "\t\n", "D:\\luceneDemo\\LuceneDemoControl\\log.txt", true);//填加到文本日志
    document.Add(new Field("id", Fieldid, Field.Store.YES, Field.Index.TOKENIZED));//创建字段
    document.Add(new Field("title", dt.Rows[i]["title"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));//创建字段
    document.Add(new Field("description", dt.Rows[i]["description"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));//创建字段
    indexwriter.AddDocument(document);
    }
    indexwriter.Optimize();//lucene优化方法,不建议总是 调用该方法,会影响速度,一天或几天调用一次就好
    indexwriter.Close();
}
 
public static void main(string id)
{
    DataTable dt = FilmTabDal.FindFilmTabAll(id);//获取到要存储到lucene的数据集
    CreateIndex(dt, id);
    //Console.WriteLine("完成");
    //Console.Read();
}

2、读取lucene,我们需要创建一个web程序来做测试

 代码如下 复制代码
/// <summary>
/// 通过关键字查询lucene
/// </summary>
/// <param name="key">关键字</param>
/// <returns></returns>
public static DataTable SearchFilmTbl(string key)
{
    Analyzer analyzer = new StandardAnalyzer();//创建标准分词器,一定要和生成的lucne生成器一一对应
 
    IndexSearcher indexsearcher = new IndexSearcher(LucenePath);//把写的分词器写好的地址加载进来
 
    QueryParser queryParser = new QueryParser("title", analyzer);//通过title列进行搜索
    Query query = queryParser.Parse(key);
    //采样
    Hits hits = indexsearcher.Search(query);//开始查询
    DataTable filmTab = new DataTable();//创建空的datatable
    if (hits.Length() > 0)
    {
    filmTab.Columns.Add("id");//创建datatable的列
    filmTab.Columns.Add("title");
    filmTab.Columns.Add("description");
    for (int i = 0, count = hits.Length(); i < count; i++)
    {
        Document document = hits.Doc(i);
        DataRow dr = filmTab.NewRow();////创建datatable的行
        dr["id"] = Convert.ToInt32(document.Get("id"));
        dr["title"] = document.Get("title").ToString();
        dr["description"] = document.Get("description").ToString();
        filmTab.Rows.Add(dr);//添加一行数据
    }
    }
    indexsearcher.Close();
    return filmTab;
}

本章只讲述lucene的基础的读取,下次我们讲通过activemq及时生成lucene。

时间: 2024-10-23 18:37:30

用Lucene.net如何实现高性能读写的方法实例的相关文章

Python读写文件方法总结

  本文实例总结了Python读写文件方法.分享给大家供大家参考.具体分析如下: 1.open 使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. ? 1 2 3 4 5 file_object = open('thefile.txt') try: all_the_text = file_object.read( ) finally: file_object.close( ) 注:不能把open语句放在try块里,因为当打

c++读写文件流实例程序讲解

 这篇文章主要介绍了c++读写文件流实例,大家参考使用吧 掌握文本文件读写的方法 了解二进制文件的读写方法   C++文件流:     复制代码 代码如下: fstream // 文件流 ifstream // 输入文件流 ofstream // 输出文件流   //创建一个文本文件并写入信息 //同向屏幕上输出信息一样将信息输出至文件 #include<iomanip.h> #include<fstream.h> void main() { ofstream f1("d

perl读写文件代码实例

  这篇文章主要介绍了perl读写文件代码实例,本文直接给出实现代码,需要的朋友可以参考下 #mode operand create truncate #read < #write > yes yes #append >> yes Case 1: Throw an exception if you cannot open the file: 代码如下: use strict; use warnings; my $filename = 'data.txt'; open(my $fh,

c++读写文件流实例程序讲解_C 语言

掌握文本文件读写的方法了解二进制文件的读写方法 C++文件流: 复制代码 代码如下: fstream // 文件流ifstream // 输入文件流ofstream // 输出文件流 //创建一个文本文件并写入信息//同向屏幕上输出信息一样将信息输出至文件#include<iomanip.h>#include<fstream.h>void main(){ ofstream f1("d:\\me.txt"); //打开文件用于写,若文件不存在就创建它 if(!f1

Win10怎么开启高性能模式?Win10开启高性能模式的方法

Win10的已经被广泛使用,如果我们想要让电脑使用的更流畅,这时我们可以开启"高性能模式",这样我们就能够提升我们系统的运行速度了.那Win10如何开启高性能模式?下面小编就和大家说一下Win10开启高性能模式的方法.一起去看看吧! 步骤如下: 1.按下"Win+X"组合键,在弹出的菜单上点击"电源选项": 2.点击当前以选中的电源计划后面的"更改计划设置": 3.将[Internet Explorer] 和[无线适配器设置]

asp.net C#读写文件应用实例与详解

asp教程.net c#读写文件应用实例与详解 1.使用filestream读写文件   文件头:   using system; using system.collections.generic; using system.text; using system.io;   读文件核心代码:   byte[] bydata = new byte[100]; char[] chardata = new char[1000]; try { filestream sfile = new filestr

Java读写文件方法总结(推荐)_java

Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既然都会想不起来怎么写了,不过我的Java代码量也实在是少的可怜,所以应该多多练习.这里做一个总结,集中在一起方面今后查看. Java读文件 package 天才白痴梦; import java.io.BufferedReader; import java.io.File; import java.io.FileInputSt

asp.net读写txt文件实例

asp教程.net读写txt文件实例   <%@ page language="vb" %> <html>    <head>       <title>unload event example</title>       <script runat="server">          dim thefile as system.io.streamreader          sub pag

vb.net 读写xml方法(1)

xml Dim domXmlDocument As System.Xml.XmlDocument    Dim tmpPath As String = AppTempFilePath    Dim xmlFile As String = tmpPath + "\testXml.xml"  窗体加载事件    Private Sub TestXml_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handl