1、使用queryparser完成解析搜索请求
2、基本格式如:
QueryParser parser=new QueryParser("字段名称","分析器实例");
Query q=parser.parse("关键词")
3、例如:解析一个关键字太阳
QueryParser parser=new QueryParser("context",new StandardAnalyzer());
Query q=parser.parse("太阳");
IndexSearcher searcher=new IndexSearcher(indexpath);
Hits hit=searcher.search(q);
PhraseQuery使用位置信息来进行相关查询,比如TermQuery使用“我们”和“祖国”进行查询,那么文档中含有这两个词的所有记录都会被查询出来。但是有一种情况,我们可能需要查询“我们”和“中国”之间只隔一个字和两个字或者两个字等,而不是它们之间字距相差十万八千里,就可以使用PhraseQuery。
        PhraseQuery正是Lucene所提供的满足上述需求的一种Query对象。它的add方法可以让用户往其内部添加关键字,在添加完毕后,用户还可以通过setSlop()方法来设定一个称之为“坡度”的变量来确定关键字之间是否允许、允许多少个无关词汇的存在。

第一种分页

//起始页
            var num = (Convert.ToInt32(pageindex) - 1) * Convert.ToInt32(pageSize);
            //读取字典
            var searcher = LucenceHelp.GetDictPath();
            //搜索条件
            var query = new PhraseQuery();
            //对搜索条件进行盘古分词
            var panGuList = LucenceHelp.GetPanGuAnalyzer(name);
            foreach (string word in panGuList)//先用空格,让用户去分词,空格分隔的就是词“计算机   专业”
            {
                query.Add(new Term("body", word));
            }
            //关键词之间可以允许的距离
            query.SetSlop(5);
            //创建容器TopDocCollector类继承自HitCollector,而HitCollector抽象类定义了实现查询(queries)、排序(sorting)、过滤(filtering)的功能
            TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
            //根据query查询条件进行查询,查询结果放入collector容器
            searcher.Search(query, null, collector);
            //分页查询
            ScoreDoc[] docs = collector.TopDocs(num, pageSize).scoreDocs;
            //总条数
            var Count = collector.GetTotalHits().ToString();
            var list = new List<string>();
            for (int i = 0; i < docs.Length; i++)
            {
                //得到查询结果文档的id(Lucene内部分配的id)
                int docId = docs[i].doc;
                //找到文档id对应的文档详细信息
                Document doc = searcher.Doc(docId);
                var _str = doc.Get("body");
                list.Add(_str);
            }
            list.Insert(0, Count);
            return list;

第二种

 
  //起始页
            var num = (Convert.ToInt32(pageindex) - 1) * Convert.ToInt32(pageSize);
            //读取字典
            var searcher = LucenceHelp.GetDictPath();      
            //生成hits结果对象,保存返回的检索结果
            Hits myhit = null;
            var q = new QueryParser("body", new StandardAnalyzer());
            Query query = q.Parse(name);
            var f = new SortField("number", SortField.FLOAT, true);//true表示降序
            var sort = new Sort();
            sort.SetSort(f);
            myhit = searcher.Search(query, sort);
          
            #region 分页查询数据
            var list = new List<string>();
            for (int i = num; i < myhit.Length(); i++)
            {
                if (i <= Convert.ToInt32(pageindex) * Convert.ToInt32(pageSize))
                {
                    var str = myhit.Doc(i);
                    var bname = str.Get("body");
                    list.Add(bname);
                }
            }
            var Count = myhit.Length().ToString();
            list.Insert(0, Count); 
            #endregion
            return list;

多条件排序

 
           var oneTxt = Request.Form["onetxt"];
            var twoTxt = Request.Form["twotxt"];
            var type = Request.Form["type"];
            //读取字典
            var searcher = LucenceHelp.GetDictPath();
            //根据id降序排列
            var  t = new Sort("number", true);
 
            #region 多条件组合查询            
            var query = new BooleanQuery();
            Analyzer analyzer = new PanGuAnalyzer();
 
            var query2 = new QueryParser("body", analyzer);
            if (!string.IsNullOrWhiteSpace(oneTxt) && !string.IsNullOrWhiteSpace(twoTxt))
            {
                var tquery1 = query2.Parse(oneTxt);
                var tquery2 = query2.Parse(twoTxt);
                if (type == "must")
                {
                    query.Add(tquery1, BooleanClause.Occur.MUST);
                    query.Add(tquery2, BooleanClause.Occur.MUST);
                }
                else if (type == "or")
                {
                    query.Add(tquery1, BooleanClause.Occur.SHOULD);
                    query.Add(tquery2, BooleanClause.Occur.SHOULD);
                }
            }
            else if (!string.IsNullOrWhiteSpace(oneTxt) && string.IsNullOrWhiteSpace(twoTxt))
            {
                var tquery1 = query2.Parse(oneTxt);
                if (type == "must")
                {
                    query.Add(tquery1, BooleanClause.Occur.MUST);
                }
                else if (type == "or")
                {
                    query.Add(tquery1, BooleanClause.Occur.SHOULD);
                }
            }
            else
            {
                var tquery2 = query2.Parse(twoTxt);
                if (type == "must")
                {
                    query.Add(tquery2, BooleanClause.Occur.MUST);
                }
                else if (type == "or")
                {
                    query.Add(tquery2, BooleanClause.Occur.SHOULD);
                }
            }
            
            #endregion
 
            Hits hits; //结果集  
            //hits = searcher.Search(query); 不排序
            hits = searcher.Search(query, t); //排序
            var list = new List<string>();
            for (int i = 0; i < hits.Length(); i++)
            {
                var str = hits.Doc(i);
                var bname = str.Get("body");
                list.Add(bname);
            }
            ViewBag.List = list;

帮助类

 
 public class LucenceHelp
    {
        //读取字典
        public static IndexSearcher GetDictPath()
        {   
            //索引库文件夹的路径
            var path = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["IndexDateBase"];
            //判断是否存在索引库文件夹,如果没有则创建
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            string indexPath = path + "\\";
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
            IndexReader reader = IndexReader.Open(directory, true);
            var searcher = new IndexSearcher(reader);
            return searcher;
        }
 
        //获取目录
        public static FSDirectory GetDirectory()
        {
            //索引库文件夹的路径
            var path = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["IndexDateBase"];
            //判断是否存在索引库文件夹,如果没有则创建
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }
            string indexPath = path + "\\";
            var  directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
            return directory;
        }
 
        // 对传递过来的字符串进行盘古分词      
        public static List<string> GetPanGuAnalyzer(string txt)
        {
            List<string> list = new List<string>();
            Analyzer analyzer = new PanGuAnalyzer();
            TokenStream tokenStream = analyzer.TokenStream("", new StringReader(txt));
            Lucene.Net.Analysis.Token token = null;
            while ((token = tokenStream.Next()) != null)
            {
                list.Add(token.TermText());
            }
            return list;
        }
    }

Lucence.Net+添加关键词+分页+排序的更多相关文章

  1. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序

    /// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...

  2. 前端笔记之Vue(六)分页排序|酷表单实战&Vue-cli

    一.分页排序案例 后端负责提供接口(3000) 前端负责业务逻辑(8080) 接口地址:从8080跨域到3000拿数据 http://127.0.0.1:3000/shouji http://127. ...

  3. ABP进阶教程4 - 分页排序

    点这里进入ABP进阶教程目录 下载插件 打开Datatables官网(https://datatables.net/download/) 下载插件,复制到JD.CRS.Web.Mvc\wwwroot\ ...

  4. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

  5. lucene 查询+分页+排序

    lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...

  6. ligerUI---ligerGrid分页排序的使用(从后台获取数据显示)

    写在前面: 最近项目的前框框架用的是ligerUI,里面用到了ligerGrid表格,下面就来说说从后台获取数据并在前台页面进行完美展示.啊哈哈哈..(天啦,坐我旁边的丽姐貌似炒股 一个月可以搞几十万 ...

  7. Oracle rownum 分页, 排序

    Oracle rownum 分页, 排序 什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条ro ...

  8. asp.net动态为网页添加关键词的代码

    如下资料是关于asp.net动态为网页添加关键词的代码,希望能对小伙伴们有较大用.HtmlMeta keywords = new HtmlMeta();keywords.Name = "ke ...

  9. discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)

    在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...

随机推荐

  1. powerpc e500系列,linux初始化的tlb汇编,添加人肉代码注释

    powerpc e500的内核启动,关于tlb的初始化可以说是重头戏.看懂这段代码后,powerpc的虚实映射基本不在话下. 这段初始化tlb要考虑的,主要是将boot可能初始化过的tlb全清零,然后 ...

  2. c# 搭建服务端 传输协议(2)

    在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才 ...

  3. 剑指offer 替换字符串中的空格

    void replaceSpace(char *str,int length) { ) return; ; ; ; while(str[originlen]!='\0') { if(str[origi ...

  4. Rikka with Graph(联通图取边,暴力)

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  5. 三维CAD塑造——基于所述基本数据结构一半欧拉操作模型

    三维CAD塑造--基于所述基本数据结构一半欧拉操作模型(elar, B_REP) (欧拉操作  三维CAD建模课程 三维CAD塑造 高曙明老师  渲染框架 brep 带洞 带柄 B_REP brep ...

  6. Windows消息大全

    最近在写TabControl的用户控件,需要用到sendMessage,已做备份. 引用:http://bbs.aau.cn/forum.php?mod=viewthread&tid=7776 ...

  7. sql中将null转换为空

    sql中varchar的默认值为null 当在页面绑定数据时就会出现无法绑定情况此时就需要在查询时转换为空,, isnull(key,'')  key 为字段名,后面的参数就是空值

  8. 用原生JS写移动动画案例及实际应用

    js很强大 相信很多人都知道,那么它有哪些强大之处呢?有兴趣的人可以去查查,这里就不赘述了,因为不在本片文章讨论的范围. 我们要讲的是怎么用原生JS写移动动画?我们先举一个最简单的动画例子,很多网站的 ...

  9. prime算法求最小生成树(畅通工程再续)

    连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...

  10. C++ template学习二 类模板定义及实例化

    一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员.默写成员函数的参数.某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的). 如果一个类中数据成员 ...