讲Lucene之前先说说数据库索引的使用,如下图

  1. 对列的计算要避免,任何形式都要避免
  2. in查询 or查询,索引会失效,可能是拆分
  3. in 换exists,not in 不要用,不走索引
  4. is null和is not null 都不走索引
  5. <> 也不走索引 ,可以拆分成> 和<
  6. join时,链接越少性能越高
  7. 左链接,以左边的结果为准,右链接反过来,连接字段要求带索引

lucene的基本说明

/// lucene.net:全文检索的工具包,不是应用,只是个类库,完成了全文检索的功能
/// 就是把数据拆分—存起来—查询时—拆分—匹配—结果
///
/// Analysis–分词器,负责把字符串拆分成原子,包含了标准分词,直接空格拆分
/// 项目中用的是盘古中文分词,
/// Document–数据结构,定义存储数据的格式
/// Index–索引的读写类
/// QueryParser–查询解析器,负责解析查询语句
/// Search—负责各种查询类,命令解析后得到就是查询类
/// Store—索引存储类,负责文件夹等等
/// Util—常见工具类库
///
/// lucene是全文搜索必备的,是大型系统必备的
///
/// Search:
/// TermQuery–单元查询 new Term(“title”,“张三”) title:张三
/// BoolenQuery—new Term(“title”,“张三”) and new Term(“title”,“李四”) title:张三 + title:李四
/// new Term(“title”,“张三”) or new Term(“title”,“李四”) title:张三 title:李四
/// WildcardQuery—通配符 new Term(“title”,“张?”) title:张?
/// new Term(“title”,“张*”) title:张*
/// PrefixQuery—前缀查询 以xx开头 title:张*
/// PhraseQuery—间隔距离 包含没有 包含提莫 而且二者距离不能超过5
/// title: “没有 提莫”~5
/// 没有蘑菇的提莫 没有蘑菇的蘑菇的蘑菇的提莫
/// FuzzyQuery—近似查询,ibhone----iphone title:ibhone~
/// RangeQuery—范围查询 [1,100] {1,100}
///
/// Lucene.Net一进一出,建立索引需要获取数据源,分词-保存到硬盘
/// 索引查找,
/// 自然会有些延迟,以前淘宝上架宝贝,第二天才能搜索的
/// 索引更新策略:1 数据跟新—丢一个队列—一个processor通过队列完成更新
/// 2 每一周全部索引一遍
///
/// lucene索引存的是原子–docid1,docid2,docid3
/// 不store可以大量节约空间;查找时原子匹配多个id;

第一步:lucene初始化索引

/// <summary>
/// 初始化索引
/// </summary>
public static void InitIndex()
{List<Commodity> commodityList = GetList();//数据源FSDirectory directory = FSDirectory.Open(StaticConstant.TestIndexPath);//文件夹using (IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED))//索引写入器{foreach (Commodity commdity in commodityList){for (int k = 0; k < 10; k++){Document doc = new Document();//一条数据doc.Add(new Field("id", commdity.Id.ToString(), Field.Store.NO, Field.Index.NOT_ANALYZED));//一个字段  列名  值   是否保存值  是否分词doc.Add(new Field("title", commdity.Title, Field.Store.YES, Field.Index.ANALYZED));doc.Add(new Field("url", commdity.Url, Field.Store.NO, Field.Index.NOT_ANALYZED));doc.Add(new Field("imageurl", commdity.ImageUrl, Field.Store.NO, Field.Index.NOT_ANALYZED));doc.Add(new Field("content", "this is lucene working,powerful tool " + k, Field.Store.YES, Field.Index.ANALYZED));doc.Add(new NumericField("price", Field.Store.YES, true).SetDoubleValue((double)(commdity.Price + k)));//doc.Add(new NumericField("time", Field.Store.YES, true).SetLongValue(DateTime.Now.ToFileTimeUtc()));doc.Add(new NumericField("time", Field.Store.YES, true).SetIntValue(int.Parse(DateTime.Now.ToString("yyyyMMdd")) + k));writer.AddDocument(doc);//写进去}}writer.Optimize();//优化  就是合并}
}

基础的查询

FSDirectory dir = FSDirectory.Open(StaticConstant.TestIndexPath);
IndexSearcher searcher = new IndexSearcher(dir);//查找器
TermQuery query = new TermQuery(new Term("title", "图书馆"));//包含
TopDocs docs = searcher.Search(query, null, 10000);//找到的数据
foreach (ScoreDoc sd in docs.ScoreDocs)
{Document doc = searcher.Doc(sd.Doc);Console.WriteLine("***************************************");Console.WriteLine(string.Format("id={0}", doc.Get("id")));Console.WriteLine(string.Format("title={0}", doc.Get("title")));Console.WriteLine(string.Format("time={0}", doc.Get("time")));Console.WriteLine(string.Format("price={0}", doc.Get("price")));Console.WriteLine(string.Format("content={0}", doc.Get("content")));
}
Console.WriteLine("1一共命中了{0}个", docs.TotalHits);

关键字查询

FSDirectory dir = FSDirectory.Open(StaticConstant.TestIndexPath);
IndexSearcher searcher = new IndexSearcher(dir);//查找器
QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "title", new PanGuAnalyzer());//解析器
string keyword = "高中政治 人 教 新课 标 选修 生活 中的 法律常识";
Query query = parser.Parse(keyword);
TopDocs docs = searcher.Search(query, null, 10000);//找到的数据
int i = 0;
foreach (ScoreDoc sd in docs.ScoreDocs)
{if (i++ < 1000){Document doc = searcher.Doc(sd.Doc);Console.WriteLine("***************************************");Console.WriteLine(string.Format("id={0}", doc.Get("id")));Console.WriteLine(string.Format("title={0}", doc.Get("title")));Console.WriteLine(string.Format("time={0}", doc.Get("time")));Console.WriteLine(string.Format("price={0}", doc.Get("price")));}
}
Console.WriteLine($"一共命中{docs.TotalHits}");

多条件查询,除了关键字,时间,排序

FSDirectory dir = FSDirectory.Open(StaticConstant.TestIndexPath);
IndexSearcher searcher = new IndexSearcher(dir);//查找器
QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "title", new PanGuAnalyzer());//解析器
string keyword = "高中政治 人 教 新课 标 选修 生活 中的 法律常识";
Query query = parser.Parse(keyword);
NumericRangeFilter<int> timeFilter = NumericRangeFilter.NewIntRange("time", 20190101, 20191231, true, true);//过滤
SortField sortPrice = new SortField("price", SortField.DOUBLE, false);//降序
SortField sortTime = new SortField("time", SortField.INT, true);//升序
Sort sort = new Sort(sortTime, sortPrice);//排序 哪个前哪个后TopDocs docs = searcher.Search(query, timeFilter, 10000, sort);//找到的数据
int i = 0;
foreach (ScoreDoc sd in docs.ScoreDocs)
{if (i++ < 1000){Document doc = searcher.Doc(sd.Doc);Console.WriteLine("***************************************");Console.WriteLine(string.Format("id={0}", doc.Get("id")));Console.WriteLine(string.Format("title={0}", doc.Get("title")));Console.WriteLine(string.Format("time={0}", doc.Get("time")));Console.WriteLine(string.Format("price={0}", doc.Get("price")));}
}
Console.WriteLine("3一共命中了{0}个", docs.TotalHits);

/// 1 索引增删改查和分词处理
/// 2 京东数据多线程建立索引
/// 3 索引查询接口封装
///
/// Lucene–封装的lucene相关操作封装
///
/// LuceneAnalyze–负责完成查询关键字解析,尽可能拆分成原子数组
/// 如果只有一个词,prefix查询 苹果*
/// 如果是多个词,换成或者关系,
/// 都是为了更多的命中结果(贪婪搜索)
/// 做个关键词清理
///
/// LuceneBulid— BuildIndex–MergeIndex 多线程写不同子路径,完成后合并
/// 增加/删除索引 更新索引-只能先删除再更新
///
/// LuceneQuery—QueryIndexPage 支持关键字,支持范围过滤 支持排序
///
/// Processor—Lucene多线程建立索引
/// IndexBuilder 入口,启动多线程创建+完成后的Merge
/// IndexBuilderPerThread 每个线程是如何完成索引建立的
///
/// DataService–CommodityLucene对外提供的搜索封装
/// CommodityRepository-SqlHelper,完成数据库数据查询

批量索引建立

IndexBuilder.Build();
int total = 0;
string pricefilter = "[50,2000]";
string priceorderby = "price desc";
List<Commodity> commoditylist = CommodityLucene.QueryCommodity(1, 30, out total, "书", null, pricefilter, priceorderby);foreach (Commodity commodity in commoditylist)
{Console.WriteLine("title={0},price={1}", commodity.Title, commodity.Price);
}

备注:代码量太大,需要详细封装可以联系我

C#/.NET 系统优化专题(搜索引擎Lucene的使用)相关推荐

  1. 一个例子学懂搜索引擎(lucene)

    http://www.vifir.com/html/20080827/1703937.html 一个例子学懂搜索引擎(lucene) 来源:javaeye 作者: phz50 2008-08-27 1 ...

  2. 搜索引擎lucene

    引用:http://baike.baidu.com/view/371811.htm Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它 ...

  3. 搜索引擎lucene点滴

    搜索引擎lucene点滴 在项目中有用到搜索引擎lucene.现将学到的lucene中的一些知识点和用法的做了下总结,希望能够对大家有所帮助. 本项目中的lucene使用概述:在Portal项目中lu ...

  4. 5分钟了解搜索引擎Lucene的原理

    场景 假设现在有10W+份word文档,让你做个web页面,给出关键词能快速搜索结果,你会怎么做?那至少有3种方案, 顺序扫描,每次检测文档中是否包含关键词,包含则加入结果列表,不包含继续查找下一个, ...

  5. 阿里P8架构师谈:开源搜索引擎Lucene、Solr、Sphinx等优劣势比较

    开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr Elasticsearch Katta.Compass等都是基于Lucene封装. 你可以想象Lucene系 ...

  6. 主流搜索引擎Lucene,Solr,ElasticSearch

    Lucene Lucene是一个Java全文搜索引擎,完全用Java编写.Lucene不是一个完整的应用程序,而是一个代码库和API,可以很容易地用于向应用程序添加搜索功能. 可扩展的高性能索引 在现 ...

  7. 开发自己的搜索引擎--Lucene 2.0+Heriterx(目录)

    第一篇  搜索引擎入门 第1章  搜索引擎与信息检索    1 1.1  搜索引擎的历史    1 1.1.1  萌芽:Archie.Gopher    1 1.1.2  起步:Robot(网络机器人 ...

  8. Elasticsearch - 搜索引擎Lucene

    1.1. Scaling Lucene 怎样在Lucene之上构建一个分布式.高度伸缩.接近实时的搜索引擎呢? 让我们回顾一下在搜索引擎(基于lucene)伸缩性这条路上都做了那些尝试,并且elast ...

  9. 搜索引擎Lucene(6):查询结果高亮及词频提取

    1.结果高亮 Lucene对高亮显示提供 了两种实现模式,Highlighter和FastVectorHighlighter.FastVectorHighlighter速度快,功能更完美.但其是有一定 ...

最新文章

  1. 商城数据库表设计介绍
  2. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...
  3. 云计算革命对国际关系的影响
  4. 批处理显示语句学习(echo、 @ 、 pause)
  5. mysql5.6.27_Centos上安装Mysql5.6.27多实例
  6. IOS逆向【2】-cydia之开发者模式
  7. CentOS7.1下targetcli的使用
  8. Loading 加载中 图片素材
  9. 138译码器的工作原理
  10. lisp6 暖通cad_cad.(CAD 分哪几种?)
  11. Tensorflow教程之语音识别
  12. 征集华人操作系统项目列表
  13. SCU-3968 Mowing the Lawn(DP+单调队列)
  14. 更简单的方法实现el-calendar日历组件中点击上个月、今天、下个月按钮时的点击事件
  15. Personalized Federated Learning with Moreau Envelopes论文阅读+代码解析
  16. react-native实现微信分享和微信支付(安卓端)
  17. 翻译Deep Learning and the Game of Go(3)第2章:围棋是一个机器学习难题(规则部分就不翻了)
  18. Proficy Historian介绍
  19. 求职面试:怎样克服面试紧张
  20. 题破山寺后禅院-唐代诗人常建

热门文章

  1. docker logs 查看docker容器日志详解
  2. Silverlight教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
  3. 用Python制作动态饼图
  4. AWS免费账号取消步骤
  5. iTerm2终端集成git缩写意思
  6. ESP32入门基础之ESP32作为 WIFI Station去连接wifi热点
  7. 红绿灯交通标志机动车行人数据集
  8. win10 安装 ad9
  9. 性别符号php,树也分男女?给6万棵杨树画上性别符号,原来是因为…
  10. ADD R0,R1,R2 的理解