sulin LuceneNet 搜索二
1.添加引用dll
using Lucene.Net.Search;
using Lucene.Net.Analysis.PanGu;
using PanGu;
using PanGu.HighLight;
using Lucene.Net.Documents;
using Lucene.Net.Store;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
2.查询代码
/// <summary>
/// 从索引搜索结果
/// </summary>
private void SearchIndex()
{
Dictionary<string, string> dic = new Dictionary<string, string>();
BooleanQuery bQuery = new BooleanQuery();
CachingWrapperFilter filter = null;
TermQuery query2 = null;
string title = string.Empty;
string content = string.Empty;
if ((Request["title"] != null && Request["title"].ToString() != "") || !string.IsNullOrEmpty(txtTitle))
{
string searchkey = Request["title"]==null?"":Request["title"].ToString();
if(!string.IsNullOrEmpty(txtTitle)){
searchkey=txtTitle;
}
foreach (string word in GetKeyWordsSplitBySpace(searchkey))
{
query2 = new TermQuery(new Term("Title", word));
bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
query2 = new TermQuery(new Term("SimpleDesc", word));
bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
query2 = new TermQuery(new Term("Tags", word));
bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
//query2 = new TermQuery(new Term("ContextDesc", word));
//bQuery.Add(query2, BooleanClause.Occur.SHOULD);//这里设置 条件为Or关系
}
dic.Add("Title", searchkey);
dic.Add("SimpleDesc", searchkey);
txtTitle = searchkey; if(this.hfradchecked.Value!="全部"){
//TermQuery query1 = new TermQuery(new Term("Types", this.hfradchecked.Value));
txttype = this.hfradchecked.Value;
query2 = new TermQuery(new Term("Types", this.hfradchecked.Value.ToString()));
QueryWrapperFilter oldFilter = new QueryWrapperFilter(query2);
filter = new CachingWrapperFilter(oldFilter); }
if (bQuery != null && bQuery.GetClauses().Length > )
{
GetSearchResult(bQuery, dic, filter);
}
} }
/// <summary>
/// 获取
/// </summary>
/// <param name="bQuery"></param>
private void GetSearchResult(BooleanQuery bQuery, Dictionary<string, string> dicKeywords, CachingWrapperFilter filter)
{
try
{
//IndexSearcher search = new IndexSearcher(IndexDic, true);
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(IndexDic), new NoLockFactory());
IndexReader reader = IndexReader.Open(directory, true);
//IndexSearcher是进行搜索的类
IndexSearcher search = new IndexSearcher(reader);
Stopwatch stopwatch = Stopwatch.StartNew();
//SortField构造函数第三个字段true为降序,false为升序
Sort sort = new Sort(new SortField("UploadTime", SortField.DOC, true));
TopDocs docs = search.Search(bQuery, filter, PageSize * PageIndex, sort);
stopwatch.Stop();
if (docs != null && docs.totalHits > )
{
lSearchTime = stopwatch.ElapsedMilliseconds;
txtPageFoot = GetPageFoot(PageIndex, PageSize, docs.totalHits, "sabrosus");
for (int i = ; i < docs.totalHits; i++)
{
if (i >= (PageIndex - ) * PageSize && i < PageIndex * PageSize)
{
Document doc = search.Doc(docs.scoreDocs[i].doc);
ResourcesModel model = new ResourcesModel()
{
ID = doc.Get("ID").ToString(),
Title = doc.Get("Title").ToString(),
Tags = doc.Get("Tags").ToString(),
CreaetBy = doc.Get("CreaetBy").ToString(),
UploadTime = doc.Get("UploadTime").ToString(),
Types = doc.Get("Types").ToString(),
SimpleDesc = doc.Get("SimpleDesc").ToString(),
ContextDesc = doc.Get("ContextDesc").ToString()
};
list.Add(SetHighlighter(dicKeywords, model));
}
}
}
}
catch (Exception ex)
{
LogHelper.SaveLogError("",ex.ToString()); } } /// <summary>
/// 处理关键字为索引格式
/// </summary>
/// <param name="keywords"></param>
/// <returns></returns>
private string[] GetKeyWordsSplitBySpace(string keywords)
{
PanGuTokenizer ktTokenizer = new PanGuTokenizer();
StringBuilder result = new StringBuilder();
List<string> listarry = new List<string>();
ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords); foreach (WordInfo word in words)
{
if (word == null)
{
continue;
}
listarry.Add(word.Word);
}
return listarry.ToArray();
} /// <summary>
/// 设置关键字高亮
/// </summary>
/// <param name="dicKeywords">关键字列表</param>
/// <param name="model">返回的数据模型</param>
/// <returns></returns>
private ResourcesModel SetHighlighter(Dictionary<string, string> dicKeywords, ResourcesModel model)
{
SimpleHTMLFormatter simpleHTMLFormatter = new PanGu.HighLight.SimpleHTMLFormatter("<font color=\"red\">", "</font>");
Highlighter highlighter = new PanGu.HighLight.Highlighter(simpleHTMLFormatter, new Segment());
highlighter.FragmentSize = ;
string strTitle = string.Empty;
string strContent = string.Empty;
string Title = model.Title;
string SimpleDesc = model.SimpleDesc;
dicKeywords.TryGetValue("Title", out strTitle);
dicKeywords.TryGetValue("SimpleDesc", out strContent); if (!string.IsNullOrEmpty(strTitle))
{
model.Title = highlighter.GetBestFragment(strTitle, model.Title);
if (model.Title == "" || model.Title==null)
{
model.Title = Title;
}
} if (!string.IsNullOrEmpty(strContent))
{
model.SimpleDesc = highlighter.GetBestFragment(strContent, model.SimpleDesc);
if (model.SimpleDesc == "" || model.SimpleDesc == null)
{
model.SimpleDesc = SimpleDesc;
}
model.SimpleDesc = GetContextSubstring(model.SimpleDesc, );
}
return model;
}
sulin LuceneNet 搜索二的更多相关文章
- lintcode:搜索二维矩阵II
题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...
- lintcode :搜索二维矩阵
题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...
- 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...
- LintCode-38.搜索二维矩阵 II
搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...
- LeetCode74.搜索二维矩阵
74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...
- LeetCode:搜索二维矩阵【74】
LeetCode:搜索二维矩阵[74] 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的 ...
- Leetcode 240.搜索二维矩阵II
搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...
- leetcode-240搜索二维矩阵II
搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...
- Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)
Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...
随机推荐
- python全栈开发:字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存. 1.百分号方式 %[(name ...
- Algo: Dynamic programming
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...
- react+redux+react-redux练习项目
一,项目目录 二.1.新建pages包,在pages中新建TodoList.js: 2.新建store包,在store包中新建store.js,reducer.js,actionCreater.js, ...
- 转载 pep8安装
一.前提准备 在Python安装了pip的情况下,命令行输入 pip install autopep8 二.PyCharm设置 成功之后,打开PyCharm,File-->setting--&g ...
- soj98 卡牌
题意:一共有n张牌,每张牌有三个属性ai,bi,ci.问在属性上限为A,B,C的所有牌中有多少张牌满足至少有两个属性可以完全压制(严格大于)那n张牌? n<=50W. 标程: #include& ...
- antidependence and data hazard
See below example. ADDD F6, F0, F8 SUBD F8, F10, F14 Some article would say that “ There’s an ant ...
- echarts高级
常用,待续... ♣tooltip自动轮播 ♣ 实现数据自动轮播 原理:其实就是timeline,获取某几段(时间)的数据,然后隐藏timeline ♣ legend自动轮播 ♣ 左侧多字出省略号 f ...
- 19-10-29-Z
%%%ZZYY 只是因为是Z才模一下的. ZJ一下: 考试T1写了三张纸但是它死了. T2T3暴力叕写跪了. 考试一定一定不能不严密,少推两个交点是要命的啊. 就因为叕叕少开龙龙见祖宗了. 如果考试能 ...
- Android之FrameLayout帧布局
1.简介 这个布局直接在屏幕上开辟出一块空白的区域,当我们往里面添加控件的时候,会默认把他们放到这块区域的左上角; 帧布局的大小由控件中最大的子控件决定,如果控件的大小一样大的话,那么同一时刻就只能看 ...
- Elasticsearch template学习
Elasticsearch template Elasticsearch存在一个关键问题就是索引的设置及字段的属性指定,最常见的问题就是,某个字段我们并不希望ES对其进行分词,但如果使用自动模板创建索 ...