I downloaded the latest build, which is versioned 2.0.004 and located at http://incubator.apache.org/lucene.net/download/Incubating-Apache-Lucene.Net-2.0-004-11Mar07.bin.zip.
To start off I wrote a small application that indexes all the INF files in my %WINDIR%\System32 directory, and allows me to search their contents.
Here is an example of how the application works:
Search...
You can enter....
filename|fullpath|lastmodified|contents
>> windows fullpath
Query: fullpath:windows
#hits: 8
----------------
Filename: homepage.inf
FullPath: c:\windows\system32\homepage.inf
Last-Modified: 8/10/2004 3:00:00 AM
----------------
Filename: ieuinit.inf
FullPath: c:\windows\system32\ieuinit.inf
Last-Modified: 6/29/2009 1:40:16 AM
----------------
Filename: mapisvc.inf
FullPath: c:\windows\system32\mapisvc.inf
Last-Modified: 4/14/2006 11:39:08 PM
----------------
Filename: mmdriver.inf
FullPath: c:\windows\system32\mmdriver.inf
Last-Modified: 8/10/2004 3:00:00 AM
----------------
Filename: msxmlx.inf
FullPath: c:\windows\system32\msxmlx.inf
Last-Modified: 8/6/2003 10:15:48 AM
----------------
Filename: pid.inf
FullPath: c:\windows\system32\pid.inf
Last-Modified: 6/20/2007 10:52:36 PM
----------------
Filename: $ncsp$.inf
FullPath: c:\windows\system32\$ncsp$.inf
Last-Modified: 9/23/2005 6:50:22 AM
----------------
Filename: $winnt$.inf
FullPath: c:\windows\system32\$winnt$.inf
Last-Modified: 9/27/2005 8:46:09 PM
Search...
You can enter....
filename|fullpath|lastmodified|contents
>> msxml contents
Query: contents:msxml
#hits: 1
----------------
Filename: msxmlx.inf
FullPath: c:\windows\system32\msxmlx.inf
Last-Modified: 8/6/2003 10:15:48 AM
Search...
You can enter....
filename|fullpath|lastmodified|contents
>>
Here is the code for the application.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Lucene.Net;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Store;
using Lucene.Net.Util;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.QueryParsers;
using sdir = System.IO.Directory;
using LDirectory = Lucene.Net.Store.Directory;
using System.IO;
namespace searchtest
{
class Program
{
static void Main(string[] args)
{
Analyzer analyzer = new StandardAnalyzer();
LDirectory directory = FSDirectory.GetDirectory("/index.bin", true);
//Directory directory = new RAMDirectory();
IndexWriter writer = new IndexWriter(directory, analyzer, true);
writer.SetMaxFieldLength(25000);
String [] infs = sdir.GetFiles(@"c:\windows\system32", "*.inf");
foreach (String inf in infs)
{
FileInfo fi = new FileInfo(inf);
Document doc = new Document();
doc.Add(new Field("filename", fi.Name, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("fullpath", fi.FullName, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("lastmodified", DateField.DateToString(fi.LastWriteTimeUtc), Field.Store.YES, Field.Index.TOKENIZED));
using (StreamReader sr = new StreamReader(inf))
{
String text = sr.ReadToEnd();
doc.Add(new Field("contents", text, Field.Store.YES,
Field.Index.TOKENIZED));
writer.AddDocument(doc);
}
}
writer.Close();
// Now search the index:
IndexSearcher isearcher = new IndexSearcher(directory);
while (true)
{
Console.WriteLine("Search...");
Console.WriteLine("You can enter....");
Console.WriteLine("filename|fullpath|lastmodified|contents");
Console.Write(">> ");
String cmd = Console.ReadLine();
if (cmd == null || cmd.Length == 0)
break;
String fieldname = "contents";
String predicate = null;
if (cmd.StartsWith("!"))
{
int index = cmd.LastIndexOf("\"");
predicate = cmd.Substring(2, index-2);
fieldname = cmd.Substring(index + 1);
}
else if (cmd.StartsWith("\""))
{
int index = cmd.LastIndexOf("\"");
if (index != -1)
{
predicate = cmd.Substring(1, index-1);
if (++index < cmd.Length)
{
fieldname = cmd.Substring(index);
}
}
}
else
{
String[] tokens = cmd.Split();
if (tokens.Length == 2)
{
predicate = tokens[0];
fieldname = tokens[1];
}
else if (tokens.Length == 1)
{
predicate = tokens[0];
}
else
{
Console.WriteLine("ERROR:");
continue;
}
}
// Parse a simple query that searches for "text":
QueryParser parser = new QueryParser(fieldname, analyzer);
Query query = null;
try
{
query = parser.Parse(predicate);
}
catch (Exception e)
{
Console.WriteLine(e);
continue;
}
Hits hits = isearcher.Search(query);
Console.WriteLine("Query: {0}", query.ToString());
Console.WriteLine("#hits: {0}", hits.Length());
// Iterate through the results:
for (int i = 0; i < hits.Length(); i++)
{
Console.WriteLine("----------------");
Document hitDoc = hits.Doc(i);
Console.WriteLine("Filename: {0}", hitDoc.Get("filename"));
Console.WriteLine("FullPath: {0}", hitDoc.Get("fullpath"));
Field f = hitDoc.GetField("lastmodified");
Console.WriteLine("Last-Modified: {0}", DateField.StringToDate(hitDoc.Get("lastmodified")));
//Console.WriteLine(hitDoc.Get("contents"));
}
}
isearcher.Close();
directory.Close();
}
}
}