lucenc.net 全文检索 创建索引、 查询、分页

 #region 创建、跟新词库
        /// <summary>
        /// 创建、跟新词库
        /// </summary>
        private void CreateIndexData()
        {
            //索引库文件夹
            FSDirectory dir = FSDirectory.Open(new DirectoryInfo(path), new NativeFSLockFactory());
            //是否存在索引库
            bool has = IndexReader.IndexExists(dir);
            if (has)
            {
                //解锁被锁定的索引库
                if (IndexWriter.IsLocked(dir))
                {
                    IndexWriter.Unlock(dir);
                }
            }
            //索引库写对象
            IndexWriter iw = new IndexWriter(dir, new PanGuAnalyzer(), !has, IndexWriter.MaxFieldLength.UNLIMITED);
            List<LuceneModel> list = LuceneBll.Instance.Get();
            foreach (var o in list)
            {
                Document d = new Document();
                //Field.Store.YES:                         存储字段值(未分词前的字段值)
                //Field.Store.NO:                          不存储,存储与索引没有关系
                //Field.Store.COMPRESS:                    压缩存储,用于长文本或二进制,但性能受损 

                //Field.Index ANALYZED;                    分词建索引
                //Field.Index ANALYZED_NO_NORMS;           分词压缩建索引
                //Field.Index NO;
                //Field.Index NOT_ANALYZED;                不分词建索引
                //Field.Index NOT_ANALYZED_NO_NORMS;       不分词压缩建索引

                //Field.TermVector NO;
                //Field.TermVector WITH_OFFSETS;           存储偏移量
                //Field.TermVector WITH_POSITIONS;         存储位置
                //Field.TermVector WITH_POSITIONS_OFFSETS; 存储位置和偏移量
                //Field.TermVector YES;                    为每个文档(Document)存储该字段的TermVector

                d.Add(new Field("Id", o.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                d.Add(new Field("Title", o.Title, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
                d.Add(new Field("Message", o.Message, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
                iw.AddDocument(d);
            }
            iw.Optimize();
            //释放文件
            iw.Close();
            dir.Close();
        }
        #endregion
#region 查询
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="str">要查询的关键字</param>
        /// <param name="index">页索引(从1开始)</param>
        /// <param name="count">每页显示数据条数</param>
        /// <returns></returns>
        private List<LuceneModel> Search(string str, int index = 1, int count = 3)
        {
            List<LuceneModel> list = null;
            //索引库文件夹
            FSDirectory dir = FSDirectory.Open(new DirectoryInfo(path), new NativeFSLockFactory());
            //是否存在索引库
            bool has = IndexReader.IndexExists(dir);
            //不存在则创建
            if (!has)
            {
                //创建索引库
                CreateIndexData();
            }
            //索引库读对象
            IndexReader ir = IndexReader.Open(dir, true);
            //索引库查询对象
            IndexSearcher searcher = new IndexSearcher(ir);
            //搜索条件
            PhraseQuery query = new PhraseQuery();
            //分词
            {
                Segment segment = new Segment();
                ICollection<WordInfo> words = segment.DoSegment(str);
                foreach (var o in words)
                {
                    query.Add(new Term("Message", o.ToString()));
                }
            }
            //指定关键词相隔最大距离
            query.SetSlop(100);
            //盛放查询结果的容器
            TopScoreDocCollector collector = TopScoreDocCollector.create(index * count, false);
            //根据query查询条件进行查询
            searcher.Search(query, null, collector);
            ScoreDoc[] docs = collector.TopDocs(count * (index - 1), count * (index - 1) + count).scoreDocs;
            if (docs.Length > 0)
            {
                list = new List<LuceneModel>();
                foreach (var o in docs)
                {
                    Document document = searcher.Doc(o.doc);
                    LuceneModel m = new LuceneModel();
                    m.Id = Convert.ToInt32(document.Get("Id"));
                    m.Title = document.Get("Title");
                    m.Message = document.Get("Message");
                    list.Add(m);
                }
            }
            //释放文件
            ir.Close();
            searcher.Close();
            dir.Close();
            return list;
        }
        #endregion

lucenc.net 全文检索 创建索引、 查询、分页

时间: 2024-08-17 05:51:31

lucenc.net 全文检索 创建索引、 查询、分页的相关文章

一、创建索引之代码开发

jar包: Lucene包: lucene-core-4.10.3.jar lucene-analyzers-common-4.10.3.jar lucene-queryparser-4.10.3.jar 其它: commons-io-2.4.jar junit-4.9.jar package com.itheima.lucene; import java.io.File; import java.io.IOException; import org.apache.commons.io.File

lucene-5.1.0 索引的创建与查询 demo

lucene以及solr作为索引工具已经被广泛使用,以前项目中也有用到过lucene4.x,如今lucene版本已经到5.1了,再次了解一下,来写个demo! 首先附一下文档及下载地址: a:下载地址 Lucene下载 b:文档地址 lucene API 所需jar包(只附lucene相关jar): lucene-analyzers-common-5.1.0.jar lucene-core-5.1.0.jar lucene-queries-5.1.0.jar lucene-queryparser

SQL Server 查询性能优化——创建索引原则(一)

索引是什么?索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以.但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好.索引建少了,用WHERE子句找数据效率低,不利于查找数据.索引建多了,不利于新增.修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间.因此要建得恰到好处,这就需要经验了. 一:索引的基本目的 索引的基

全文检索之lucene的优化篇--创建索引库

在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引. DirectoryTest类中的代码如下,基本上就是在HelloWorld的基础上改改就可以了. 里面一共三个方法,testDirectory(),测试创建索引库;testDirectoryFSAndRAM(),结合方法1的两种创建方式,优化;testDirectoryOptimize(),在方法2个基础上,研究索引的优化创建,减少创建的索引

测试使用索引库crud和高级查询分页

1.搭建ES的服务 导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> 配置ES ... spring: application: name: hrm-es-service data: elasticsearc

04.全文检索的原理-创建索引

你要想查这个东西,得先把库建好.先创建索引再查询索引,这两部分.建立索引,先把文档内容里面的词找出来然后建立索引.我们这里就是一个分析的过程,分析怎么分析?词与词之间有空格,根据空格来把它分词就可以了.在关系型数据库中查询的时候大小写单词是没有关系的.在Java里面,大小写字母是不同字符串,都转换成大写或者都转换成小写都可以啊.但是你要统一一个大小写,统一完了之后你大写开头的单词(例如Lucene)和小写开头的单词(例如lucene)就是同一个单词.去除常用词,is或者a这些,没有什么实际意义,

对于大量left join 的表查询,可以在关键的 连接节点字段上创建索引。

问题: 大量的left join 怎么优化 select a.id,a.num,b.num,b.pcs,c.num, c.pcs,d.num,d.pcs,e.num,e.pcs,a.x, a.y from a left join b.id=a.id and b.time=a.time left join c.id=a.id and b.time=a.time left join d.id=a.id and b.time=a.time left join e.id=a.id and b.time=

SQL Server 查询性能优化——创建索引原则(二)

三:索引的建立原则 一般来说,建立索引要看数据使用的场景,换句话来说哪些访问数据的SQL语句是常用的,而这些语句是否因为缺少索引(也有可能是索引过多)变的效率低下.但绝不是所有的SQL语句都要建立索引,如果所有的SQL语句都建立索引,那么可能导致建立过多的索引. 我碰到过每秒钟新增记录超过千条的案例,虽然该数据表仅有聚集索引,但因为已存在的键值字段的值和新增数据键值字段的值并不是按顺序递增,每次新增记录时,肯定造成整体数据行的重新排列.在移掉聚集索引后,性能约提升20%.也曾经碰到过一个数据表上

mysql 创建索引、重建索引、查询索引、删除索引 转自:http://www.phpernote.com/mysql/942.html

本篇文章主要是对MySQL索引操作方法做了一下总结,包括创建索引.重建索引.查询索引.删除索引的操作.以下所列示例中中 `table_name` 表示数据表名,`index_name` 表示索引名,column list 表示字段列表(如:`id`,`order_id`). 1.创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引.以下命令语句分别展示了如何创建主键索引(PRIMARY KEY),联合索引(UNI