[Lucene.Net] 基本用法
最新推荐文章于 2022-08-19 20:24:31 发布
using System; using System.Collections.Generic; using System.Text; using Lucene.Net; using Lucene.Net.Analysis; using Lucene.Net.Analysis.Standard; using Lucene.Net.Documents; using Lucene.Net.Index; using Lucene.Net.QueryParsers; using Lucene.Net.Search; using Lucene.Net.Store; using Lucene.Net.Util; namespace ConsoleApplication1.Lucene { public class LuceneTest { private const string FieldName = "name"; private const string FieldValue = "value"; private Directory directory = new RAMDirectory(); private Analyzer analyzer = new StandardAnalyzer(); public LuceneTest() { } private void Index() { IndexWriter writer = new IndexWriter(directory, analyzer, true); writer.maxFieldLength = 1000; for (int i = 1; i <= 100; i++) { Document document = new Document(); document.Add(new Field(FieldName, "name" + i, Field.Store.YES, Field.Index.UN_TOKENIZED)); document.Add(new Field(FieldValue, "Hello, World!", Field.Store.YES, Field.Index.TOKENIZED)); writer.AddDocument(document); } writer.Optimize(); writer.Close(); } private void Search() { Query query = QueryParser.Parse("name*", FieldName, analyzer); IndexSearcher searcher = new IndexSearcher(directory); Hits hits = searcher.Search(query); Console.WriteLine("符合条件记录:{0}; 索引库记录总数:{1}", hits.Length(), searcher.Reader.NumDocs()); for (int i = 0; i < hits.Length(); i++) { int docId = hits.Id(i); string name = hits.Doc(i).Get(FieldName); string value = hits.Doc(i).Get(FieldValue); float score = hits.Score(i); Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}", i + 1, docId, name, value, score); } searcher.Close(); } } }
private Directory directory = FSDirectory.GetDirectory("c:/index", false);
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:/index", false)); //或 //private Directory directory = new RAMDirectory(c:/index");
Query query = MultiFieldQueryParser.Parse("name*", new string[] { FieldName, FieldValue }, analyzer); IndexReader reader = IndexReader.Open(directory); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 词语搜索 Query query2 = new WildcardQuery(new Term(FieldName, "name*")); // 通配符 //Query query3 = new PrefixQuery(new Term(FieldName, "name1")); // 字段搜索 Field:Keyword,自动在结尾添加 * //Query query4 = new RangeQuery(new Term(FieldNumber, NumberTools.LongToString(11L)), new Term(FieldNumber, NumberTools.LongToString(13L)), true); // 范围搜索 //Query query5 = new FilteredQuery(query, filter); // 带过滤条件的搜索 BooleanQuery query = new BooleanQuery(); query.Add(query1, BooleanClause.Occur.MUST); query.Add(query2, BooleanClause.Occur.MUST); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
Score = Score * Boost
Document document = new Document(); switch (vip) { case VIP.Gold: document.SetBoost(2F); break; case VIP.Argentine: document.SetBoost(1.5F); break; }
Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false)); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query, sort);
// index document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED); //... // search Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-1"), DateTime.Parse("2005-10-30")); Hits hits = searcher.Search(query, filter);
// index document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED)); //... // search Filter filter = new RangeFilter(FieldNumber, NumberTools.LongToString(100L), NumberTools.LongToString(200L), true, true); Hits hits = searcher.Search(query, filter);
QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));
Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15")); Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true); Query query = QueryParser.Parse("name*", FieldName, analyzer); query = new FilteredQuery(query, filter); query = new FilteredQuery(query, filter2); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:/index"), IndexReader.Open(@"//server/index") }); IndexSearcher searcher = new IndexSearcher(reader); Hits hits = searcher.Search(query);
IndexSearcher searcher1 = new IndexSearcher(reader1); IndexSearcher searcher2 = new IndexSearcher(reader2); MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 }); Hits hits = searcher.Search(query);
Directory directory1 = FSDirectory.GetDirectory("index1", false); Directory directory2 = FSDirectory.GetDirectory("index2", false); IndexWriter writer = new IndexWriter(directory2, analyzer, false); writer.AddIndexes(new Directory[] { directory }); Console.WriteLine(writer.DocCount()); writer.Close();
BooleanQuery query = new BooleanQuery(); query.Add(query1, true, false); query.Add(query2, true, false); //... Console.WriteLine("Syntax: {0}", query.ToString());
IndexReader reader = IndexReader.Open(directory); // 删除指定序号(DocId)的 Document。 reader.Delete(123); // 删除包含指定 Term 的 Document。 reader.Delete(new Term(FieldValue, "Hello")); // 恢复软删除。 reader.UndeleteAll(); reader.Close();
Directory directory = FSDirectory.GetDirectory("index", false); IndexWriter writer = new IndexWriter(directory, analyzer, false); writer.AddDocument(doc1); writer.AddDocument(doc2); writer.Optimize(); writer.Close();
IndexWriter writer = new IndexWriter(directory, analyzer, true); writer.maxFieldLength = 1000; // 字段最大长度 writer.mergeFactor = 1000; writer.minMergeDocs = 1000; for (int i = 0; i < 10000; i++) { // Add Documentes... } writer.Optimize(); writer.Close();