我写了一个简单的Lucene.net的程序,运行时首先弹出对话框,提示选择需要索引的文件夹,并在此文件下建立索引文件.保存在"Index"文件夹里面(为简化,我注释掉了递归遍历子目录所有文件,目前程序只生成第一层文件的索引).
这是弹出的选择路径对话框:
这是程序界面:
这是我的窗体后台代码:
Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyLuceneNet.Functions;
namespace MyLuceneNet
{
public partial class SearchForm : Form
{
//Lucene方法类
LuceneOperate luceneOp;
/// <summary>
/// 构造函数
/// </summary>
public SearchForm()
{
InitializeComponent();
}
/// <summary>
/// 窗体加载方法
/// <para>窗体加载时,创建Lucene方法类LuceneOperate的实例</para>
/// <para>此LuceneOperate构造函数中的路径由folderBrowserDialog1选择</para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SearchForm_Load(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
luceneOp = new LuceneOperate(folderBrowserDialog1.SelectedPath);
}
}
/// <summary>
/// 点击查询按钮,则根据textBox查询内容文件的内容进行查询
/// <para>查询结果显示到listBox文件中</para>
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button查询_Click(object sender, EventArgs e)
{
listBox文件.DataSource = luceneOp.GetResults(textBox查询内容.Text.Trim(), "Contents");
}
/// <summary>
/// 生成索引按钮,调用生成索引的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button生成索引_Click(object sender, EventArgs e)
{
if (luceneOp.CreateIndex())
{
MessageBox.Show("索引生成成功!", "索引生成", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("索引生成失败!", "索引生成", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
这是Lucene方法类:
Code
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net.Index;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Search;
using Lucene.Net.QueryParsers;
namespace MyLuceneNet.Functions
{
public class LuceneOperate
{
//索引路径
private string indexPath;
//文件路径
private string filesPath;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_indexPath">传入的文件路径</param>
public LuceneOperate(string _filesPath)
{
//文件路径
filesPath = _filesPath;
//索引保存路径
indexPath = _filesPath + "\\Index";
}
/// <summary>
/// 创建索引
/// </summary>
/// <returns>返回成功情况(true,false)</returns>
public bool CreateIndex()
{
try
{
//建立一个索引书写器
IndexWriter indxWritr = new IndexWriter(indexPath, new StandardAnalyzer(), true);
InitIndex(filesPath, indxWritr);
//索引优化
indxWritr.Optimize();
//关闭索引读写器
indxWritr.Close();
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 初始的索引(未经优化)
/// </summary>
/// <param name="_filesPath">文件的路径</param>
/// <param name="_indxWritr">索引书写器</param>
private void InitIndex(string _filesPath, IndexWriter _indxWritr)
{
DirectoryInfo dirInfo = new DirectoryInfo(_filesPath);
/*
* 注释掉了遍历子文件夹的文件的
* */
//foreach (DirectoryInfo dirin in dirInfo.GetDirectories())
// InitIndex(dirin.FullName, _indxWritr);
foreach (FileInfo f in dirInfo.GetFiles())
{
Document doc = new Lucene.Net.Documents.Document();
//文件名
doc.Add(new Field("FileName", f.FullName, Field.Store.YES, Field.Index.UN_TOKENIZED));
//文件内容
doc.Add(new Field("Contents", new System.IO.StreamReader(f.FullName, System.Text.Encoding.Default)));
_indxWritr.AddDocument(doc);
}
}
/// <summary>
/// 得到结果的string的集合
/// </summary>
/// <param name="content">所要搜索的内容</param>
/// <param name="field">搜索的field范围</param>
/// <returns>结果集合</returns>
public List<string> GetResults(string content,string field)
{
Hits hits = GetHits(content, field);
List<string> Results = new List<string>();
for (int i = 0; i < hits.Length(); i++)
{
Results.Add(hits.Doc(i).Get(field));
}
return Results;
}
/// <summary>
/// 得到Hits,GetResults的辅助类
/// </summary>
/// <param name="content">所要搜索的内容</param>
/// <param name="field">field</param>
/// <returns>结果集合</returns>
private Hits GetHits(string content,string field)
{
//打开索引,索引目录为程序刚开始选择的路径+"\\Index"
IndexReader indxRedr = IndexReader.Open(indexPath);
IndexSearcher indxSercr = new IndexSearcher(indxRedr);
QueryParser parser = new QueryParser(field, new StandardAnalyzer());
Query q = parser.Parse(content);
Hits hits = indxSercr.Search(q);
return hits;
}
}
}
我测试时写了四个txt文件,文件名为1.txt,2.txt,3.txt和4.txt,文件内容是分别为“1”,“2”,“3”,“4”(分别就一个字),但是我查询“1”时(其实不管查询什么)结构都是空的,查不出个所以然。
我不知道是索引建立出了问题还是什么就下载了NLuck(这是博客园的一位朋友写的分析Lucene.net索引的程序),但是这个程序不能打开我建立的索引,不过这个程序写的是能打开Lucene.net2.0-2.3的索引,我用的是Lucene.net2.4,不知道是不是我的索引的问题,还是我查询写错了的问题。
请高手帮我看看,不胜感激!