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.该矩阵 ...
随机推荐
- Ubuntu环境下安装Scala以及安装IntelliJ Scala插件(Plugin)
一.Scala介绍 1.结合Spark处理大数据 这是Scala的一个主要应用,而且Spark也是那Scala写的. 2.Java的脚本语言版 可以直接写Scala的脚本,也可以在.sh直接使用Sc ...
- AJAX相关概念及应用
1.Ajax(Asynchronous JavaScript And XML) 异步的JavaScript和XML XML 可扩展标记语言 Ajax是常用的WEB开发技术,是联系前端和后端的桥梁 应用 ...
- 使用log4j实现日志API
添加SLF4J依赖,用于提供日志API, 使用log4j作为实现 1.pom.xml添加SLF4J依赖 <!-- SLF4J --> <dependency> <grou ...
- postgresql计算2个日期之间工作日天数的方法
select date_part( 'day', minus_weekend(begin_date,end_date)) from table1 where name in ('a', 'b', 'c ...
- xml的修改遍历,以及建立
1.xml的遍历 2.xml的遍历 3.xml的建立
- 集合遍历remove时ConcurrentModificationException异常
1.集合遍历时候,有时候需要remove或add操作,这时候遍历方式可能会影响程序运行 例如: @Test public void test1() { List<Integer> intL ...
- csp-s模拟65Simple,Walk, Travel,棋盘题解
题面:https://www.cnblogs.com/Juve/articles/11639923.html simple: 考试时只想到的暴力exgcd判断 考虑n,m互质的情况: 我们枚举y,对于 ...
- <input> type 属性
单行文本域 语法格式:<input type = “text” 属性 = “值” /> 常用属性 1 name:文本框的名字.命名规则是:可以包含字母.数字.下划线,只能以字母开头. ...
- PAT甲级——A1105 Spiral Matrix【25】
This time your job is to fill a sequence of N positive integers into a spiral matrix in non-increasi ...
- PAT甲级——A1073 Scientific Notation
Scientific notation is the way that scientists easily handle very large numbers or very small number ...