




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 基本应用 using System;using System.Collect ion s.Ge neric;using System.Text;using Luce ne.Net;using Luce ne.Net.A nalysis;using Luce ne.Net.A nalysis.Sta ndard;using Luce ne.Net.Docume nts;using Luce ne.Net.l ndex;using Luce ne.Net.QueryParsers;using Luce ne.Net.Search;using Luce ne.Net.Store;using L
2、uce ne.Net.Util;n amespace Con soleApplicati on 1.Luce nepublic class Luce neTestprivate const stri ng FieldName =a?name ;private const string FieldValue =value ;private Directory directory = new RAMDirectory();private An alyzer an alyzer = new Stan dardA nalyzer();public Luce neTest()private void I
3、n dex()In dexWriter writer = new In dexWriter(directory, an alyzer, true);writer.maxFieldLe ngth = 1000;for (int i = 1; i <= 100; i+)Docume nt docume nt = new Docume nt();document.Add(new Field(FieldName,name ” + i, Field.Store.YES,Field.I ndex.UN_TOKENIZED);docume nt.Add( new Field(FieldValue,He
4、llo, World! ”,Field.Store.YES,Field .In dex.TOKENIZED);writer.AddDocume nt(docume nt);writer.Optimize();writer.Close();private void Search()Query query = QueryParser.Parse( name* ”,FieldName, analyzer);In dexSearcher searcher = new In dexSearcher(directory);Hits hits = searcher.Search(query);Console
5、.WriteLine(符合条件记录:0;索引库记录总数:1 ”, hits.Length(),searcher.Reader.NumDocs();for (int i = 0; i < hits.Le ngth(); i+)int docId = hits .I d(i);string name = hits.Doc(i).Get(FieldName);stri ng value = hits.Doc(i).Get(FieldValue);float score = hits.Score(i);Co nsole.WriteL in e(0: DocId:1; Name:2; Value:
6、3; Score:4 ”,i + 1, docId, n ame, value, score);searcher.Close();除了 RAMDirectory ,还可以使用 FSDirectory。(注意 FSDirectory .GetDirectory 的 create 参数,为true时将删除已有索引库文件, 可以通过IndexReader.IndexExists() 方法判断。) 从指定目录打开已有索引库。private Directory directory = FSDirectory.GetDirectory(c:index ”,false);将索引库载入内存,以提高搜索速度。p
7、rivate Directory directory = new RAMDirectory(FSDirectory.GetDirectory("c:index ”,false);/或/private Directory directory = new RAMDirectory(c:in dex");2. 多字段搜索使用MultiFieldQueryParser可以指定多个搜索字段。Query query = MultiFieldQueryParser.Parse( name* ”new string FieldName,FieldValue , an alyzer);In
8、dexReader reader = In dexReader.Ope n( directory);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);3. 多条件搜索除了使用QueryParser.Parse分解复杂的搜索语法外,还可以通过组合多个Query来达到目的。hame1 "); /词语搜索name*"); / 通配符name1 "); /字段搜索Query query1 = new TermQuery (new Term(Fiel
9、dValue,Query query2 = new WildcardQuery (new Term(FieldName,/Query query3 = new PrefixQuery (new Term(FieldName, Field:Keyword,自动在结尾添加* /Query query4 = new Ran geQuery (new Term(FieldNumber,NumberTools.LongT oString(1 1L), new Term(FieldNumber,NumberTools.LongT oString(13L), true); / 范围搜索/Query quer
10、y5 = new FilteredQuery(query, filter); /带过滤条件的搜索Boolea nQuery query = new Boolea nQuery();query.Add(query1, Boolea nClause.Occur.MUST);query.Add(query2, Boolea nClause.Occur.MUST);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);4. 设置权重可以给Document和Field增加权重(Boo
11、st),使其在搜索结果排名更加靠前。缺省情况下,搜索结果以Document.Score作为排序依据,该数值越大排名越靠前。Boost缺省值为1。Score = Score * Boost通过上面的公式,我们就可以设置不同的权重来影响排名。如下面的例子中根据VIP级别设定不同的权重。Docume nt docume nt = new Docume nt();switch (vip)case VIP .Gold: document.SetBoost(2F); break;case VIP .Argentine: document.SetBoost(1.5F); break;只要Boost足够大,那
12、么就可以让某个命中结果永远排第一位,这就是百度等网站的”收费排名”业务。明显有失公平,鄙视一把。5. 排序通过SortField的构造参数,我们可以设置排序字段,排序条件,以及倒排。Sort sort = new Sort( new SortField(FieldName, SortField.DOC, false);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query, sort);排序对搜索速度影响还是很大的,尽可能不要使用多个排序条件。6. 过滤使用Filter对搜索结
13、果进行过滤,可以获得更小范围内更精确的结果。举个例子,我们搜索上架时间在2005-10-1至U 2005-10-30 之间的商品。对于日期时间,我们需要转换一下才能添加到索引库,同时还必须是索引字段。/indexdocument.Add(FieldDate, DateField.DateToString(date), Field.Store.YES,Field.I ndex.UN_TOKENIZED);/ searchFilter filter = new DateFilter(FieldDate, DateTime.Parse(2005-10-1 ”),DateTime.Parse( 200
14、5-10-30 );Hits hits = searcher.Search(query, filter);除了日期时间,还可以使用整数。比如搜索价格在100 200 之间的商品。Luce ne.Net NumberTools对于数字进行了补位处理,如果需要使用浮点数可以自己参考源码进行。/indexdocument.Add(new Field(FieldNumber, NumberTools.LongToString(long)price), Field.Store.YES, Fieldn dex.UN_TOKENIZED);/ searchFilter filter = new Ra nge
15、Filter(FieldNumber, NumberTools.Lo ngToStri ng(100L),NumberTools.LongT oString(200L), true, true);Hits hits = searcher.Search(query, filter);使用Query作为过滤条件。QueryFilter filter = new QueryFilter(QueryParser.Parse(name2 ",FieldValue, analyzer);我们还可以使用FilteredQuery进行多条件过滤。Filter filter = new DateFil
16、ter(FieldDate, DateTime.Parse(2005-10-10 ”),DateTime.Parse( 2005-10-15 );Filter filter2 = new Ran geFilter(FieldNumber, NumberTools.L on gToStri ng(11L),NumberTools.LongT oString(13L), true, true);Query query = QueryParser.Parse(name* ”,FieldName, analyzer);query = new FilteredQuery(query, filter);q
17、uery = new FilteredQuery(query, filter2);In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);7. 分布搜索我们可以使用 MultiReader 或MultiSearcher 搜索多个索引库。MultiReader reader = new MultiReader( new In dexReader IndexReader.Open("c:index "),1 ndexReader.Open("serv
18、erindex ");In dexSearcher searcher = new In dexSearcher(reader);Hits hits = searcher.Search(query);或In dexSearcher searcher1 = new In dexSearcher(reader1);In dexSearcher searcher2 = new In dexSearcher(reader2);MultiSearcher searcher = new MultiSearcher( new Searchable searcher1, searcher2 );Hit
19、s hits = searcher.Search(query);还可以使用 ParallelMultiSearcher进行多线程并行搜索。8. 合并索引库将 directory1 合并到 directory2 中。Directory directory1 = FSDirectory.GetDirectory(ihdex1 ",false);Directory directory2 = FSDirectory.GetDirectory(ihdex2 ",false);IndexWriter writer = new IndexWriter(directory2, analyz
20、er, false);writer.Add In dexes (new Directory directory );Co nsole.WriteL in e(writer.DocCou nt();writer.Close();9. 显示搜索语法字符串我们组合了很多种搜索条件,或许想看看与其对等的搜索语法串是什么样的。Boolea nQuery query = new Boolea nQuery();query.Add(query1, true, false);query.Add(query2, true, false);/Console.WriteLine(Syntax: 0 ”,query.ToString();输出:Sy ntax: +(name:n ame* value: name*) +nu mber:0000000000000000b TO0000000000000000d呵呵,就这么简单。10. 操作索引库删除(软删除,仅添加了删除标记。调用IndexWriter.Optimize()后真正删除。)In dexReader reader = In dexReader.Ope n( directory);/删除指定序号(DocId)的 Document 。reader.Delete(123);II删除包含指定 Te
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民航空中安全保卫专业教学标准(高等职业教育专科)2025修订
- 2024-2025学年河北省保定市六校联盟高二下学期期中地理试题及答案
- 2025年中国可调节人体工学办公椅行业市场全景分析及前景机遇研判报告
- 2025年中国绝缘材料行业市场全景分析及前景机遇研判报告
- 2025年中国家用塔式风扇行业市场全景分析及前景机遇研判报告
- 中国起重运输设备行业市场发展现状及前景趋势与投资分析研究报告(2024-2030)
- 中国计算机整机行业市场调研及未来发展趋势预测报告
- 中国多柱式散热器行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国纸张防伪行业市场运行现状及未来发展预测报告
- 方形蚊帐项目投资可行性研究分析报告(2024-2030版)
- 定额〔2025〕1号文-关于发布2018版电力建设工程概预算定额2024年度价格水平调整的通知
- 毕业设计(论文)-除雪车除雪装置的设计及仿真分析
- 蓝天救援队队员入队申请表
- 施工升降机月检记录表
- T-CCIAT 0044-2022 智慧园区以太全光网络建设技术规程
- 广西基本医疗保险异地就医备案登记表-示例样表
- 供应商绿色环保环境管理体系评估表
- GB∕T 11344-2021 无损检测 超声测厚
- 《云南省建筑工程资料管理规程应用指南)(上下册)
- 数列求和中常见放缩方法和技巧(含答案)
- 宝兴县中药材生产现状及发展思路
评论
0/150
提交评论