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;
}
}
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
/// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...
- 前端笔记之Vue(六)分页排序|酷表单实战&Vue-cli
一.分页排序案例 后端负责提供接口(3000) 前端负责业务逻辑(8080) 接口地址:从8080跨域到3000拿数据 http://127.0.0.1:3000/shouji http://127. ...
- ABP进阶教程4 - 分页排序
点这里进入ABP进阶教程目录 下载插件 打开Datatables官网(https://datatables.net/download/) 下载插件,复制到JD.CRS.Web.Mvc\wwwroot\ ...
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- lucene 查询+分页+排序
lucene 查询+分页+排序 1.定义一个工厂类 LuceneFactory 1 import java.io.IOException; 2 3 import org.apache.lucene.a ...
- ligerUI---ligerGrid分页排序的使用(从后台获取数据显示)
写在前面: 最近项目的前框框架用的是ligerUI,里面用到了ligerGrid表格,下面就来说说从后台获取数据并在前台页面进行完美展示.啊哈哈哈..(天啦,坐我旁边的丽姐貌似炒股 一个月可以搞几十万 ...
- Oracle rownum 分页, 排序
Oracle rownum 分页, 排序 什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条ro ...
- asp.net动态为网页添加关键词的代码
如下资料是关于asp.net动态为网页添加关键词的代码,希望能对小伙伴们有较大用.HtmlMeta keywords = new HtmlMeta();keywords.Name = "ke ...
- discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)
在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...
随机推荐
- [置顶] 北漂的大三IT男(暂完)
今天是2013年8月9日,是我待在北京的最后一个晚上,今天我已经正式向公司提出辞职了,虽然公司已经答应从下个月起涨部分工资,但是我还是坚决的离开了,回想当时进公司的想法----------干了一个月后 ...
- Node.cloneNode()方法
概述 返回调用该方法的节点的一个副本. 语法 var dupNode = node.cloneNode(deep);node将要被克隆的节点dupNode克隆生成的副本节点deep 可选是否采用深度克 ...
- iOS 使用UILocalizedIndexedCollation实现区域索引标题(Section Indexed Title)即拼音排序
UITableView在行数相当多的时候,给人的感觉是非常笨重的.通常为了方便用户使用,采用的方法有:搜索框.按层级展示.区域索引标题. 前两种就不用介绍了,此文就介绍区域索引标题的实现. 区域索引标 ...
- oracle 插入含&字符串
1.创建表 SQL> create table t(id number,name varchar2(20)); 表已创建. 2.常规方式插入 SQL> insert into t valu ...
- 指定hive输出格式
0.11版本以前: sed -e 's/\x01/|/g' file 0.11版本以后: insert overwrite local directory '/opt/aimcpro/libc/tes ...
- python正则表达式实例
1.将"(332.21)luck李."中(332.21)抽取出来同时能够 将”(23)luck李.“中的(23)抽取出来 pp = re.compile('(\(\d*(.\d*) ...
- XSS【跨站脚本攻击】
从客户端(txt="<script><a href="www...")中检测到有潜在危险的 Request.Form 值. 如果你使用的是.NET 3. ...
- 常用ajax请求
JQuery版本的ajax请求:(包括处理WebService中xml字符串) $.ajax({ type: "POST", async: true, url: "&qu ...
- python 之日期时间处理
##python时间操作一般使用time.datetime两个模块 对于time模块,时间的表示模式有3种1.时间戳:time.time()2.字符串: time.strftime('%Y%m%d') ...
- 有关extern的用法
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言, C++保留了一部分过程式 ...