Lucence.Net+添加关键词+分页+排序

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;

}

}

时间: 2024-08-02 15:43:45

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

中继器的使用——搜索/分页/排序

1.搜索: 1)单一条件搜索: 步骤: 判断输入是否为空: 不为空,按输入的条件检索: 为空,展示全部 不为空的用例: 为空的用例: 2)组合条件搜索 步骤: 姓名.部门都不为空: 姓名为空,部门不为空: 姓名不为空.部门为空: 姓名.部门为空 姓名.部门都不为空的情况设置如下: 姓名筛选: 部门筛选: fx设置: 2.排序: 为增大排序点击范围,使用"热区",在热区中添加点击排序事件 3)分页 首页: 上一页/下一页/尾页 页码显示设置方法: 新增文本标签,清空内容,控件命名:页码显

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

在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\setting.htm 2.复制红色方块内的代码粘贴到方框底下: 3.将粘贴中的 c1 全部替换成 c2 和buttonbackcolor 替换成 linkbuttonbackcolor:保存即可,注意 排 是utf-8编码 <tr><td s="1" class="

mysql 两表联查分页排序效率优化

数据库中有两张表 t1 存储消息信息 +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI |

SpringBoot2.0系列教程(七)Springboot框架添加PageHelper分页查询功能

Hello大家好,本章我们添加PageHelper分页查询功能.另求各路大神指点,感谢 一:什么是PageHelper PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件 物理分页 支持常见的 12 种数据库.Oracle,MySql,MariaDB,SQLite,DB2,PostgreSQL,SqlServer 等 支持多种分页方式 支持常见的RowBounds(PageRowBounds),PageHelper.startPage 方法调用,Mapper 接口参数调用

wordpress添加关键词和描述

找到主题的header.php文件,然后在其<head>标签内加入加一下代码: 详细版 <?php $description = ''; $keywords = ''; if (is_home() || is_page()) { // 将以下引号中的内容改成你的主页description $description = "博客描述"; // 将以下引号中的内容改成你的主页keywords $keywords = "关键词,注意关键词之前以英文逗号隔开"

使用redis完成搜索/分页/排序

功能:根据用户展示pn的相关信息,能搜索具体的pn, 可以分页 思路:redis常用结构第一就想到了hash,可以搜索和存储信息:Sorted Set 可以搜索和截取 将Pn存储在两种结构中,先从set分页后,在去hash获取具体内容 数据格式: '用户ID1' => [ 'pnNumber1' => [ 'pnName' => 'E', 'pnCategory' => 'A', 'pnDesc' => 'C' ], 'pnNumber2' => [ 'pnName'

Oracle分页排序的实现与分页数据重复问题

对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法.但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光.另外,网络传输也是问题.如果有1000万条数据,用户想看最后一条,这时即便有足够的内存,在网络上传输这么多数据也得一两小时吧,恐怕没几个用户有这么耐心等.因此分页是必须的. 现在网上的论坛.博客什么的,基本上都会有分页功能,有些是SQL分页的,有些可能是NOSQL用其它方法分页,都有很成熟的东西了.本文根据我自己的经验,以ORACLE为例,讲下简单的SQL分页和排序

mark--[Redis用户添加、分页、登录、注册、加关注案例]

连接redis代码redis.php <?php //实例化 $redis = new Redis(); //连接服务器 $redis->connect("localhost"); //授权 $redis->auth("lamplijie"); 说明:这是入口文件,使用redis数据库必须先引入它.这样才能用php操作redis数据库. 列表页list.php <a href="add.php">注册</a&g

MongoDB的分页排序

我们已经学过MongoDB的 find() 查询功能了,在关系型数据库中的选取(limit),排序(sort) MongoDB中同样有,而且使用起来更是简单 首先我们看下添加几条Document进来 现在有四条Document 根据它们, 对 Limit Skip Sort 分别展开学习 最后来一个 大杂烩 1. Limit 选取 : 我要从这些 Document 中取出多少个 做个小例子 : 我只要 2 条 Document 结果是很明显的,很赤裸裸的,很一丝不挂的 但是我还是要解释一下 :