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 搜索二的更多相关文章

  1. lintcode:搜索二维矩阵II

    题目 搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没 ...

  2. lintcode :搜索二维矩阵

    题目: 搜索二维矩阵 写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每行的第一个数大于上一行的最后一个整数. 样例 考虑下列矩阵: [ [1 ...

  3. 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

    接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...

  4. LintCode-38.搜索二维矩阵 II

    搜索二维矩阵 II 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复 ...

  5. LeetCode74.搜索二维矩阵

    74.搜索二维矩阵 描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 示 ...

  6. LeetCode:搜索二维矩阵【74】

    LeetCode:搜索二维矩阵[74] 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的 ...

  7. Leetcode 240.搜索二维矩阵II

    搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以下特性: 每行的元素从左到右升序排列. 每列的元素从上到下升序排列. 示例: 现有 ...

  8. leetcode-240搜索二维矩阵II

    搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...

  9. Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II)

    Leetcode之二分法专题-240. 搜索二维矩阵 II(Search a 2D Matrix II) 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵 ...

随机推荐

  1. Django中static文件的引入

    1. 在django project中创建 static文件夹 2.settings.py中配置要在 STATIC_URL = '/static/'  下边 STATICFILES_DIRS = [ ...

  2. Linux 实用指令(5)--组管理和权限管理

    目录 组管理和权限管理 1 Linux组基本介绍 2 文件/目录 所有者 2.1 查看文件的所有者 2.2 修改文件所有者 3 组的创建 3.1 基本指令 3.2 应用实例 4 文件/目录 所在组 4 ...

  3. mysql权限修改记录

    select user, password, host from mysql.user; GRANT ALL PRIVILEGES ON *.* TO 'root'@'147.114.169.197' ...

  4. 分离vue文件,方便后期维护

    参考: https://www.cnblogs.com/wy120/p/10179901.html https://blog.csdn.net/sinat_36146776/article/detai ...

  5. groupBy 后附加数量和每组百分比

    SELECT i_State, n, , ) rat FROM ( SELECT * FROM ( ) n FROM planinfo GROUP BY i_State ) t1 ) s ) t

  6. RabbitMQ代码操作之发消息和序列化机制

    几个自动配置类: 1.RabbitAutoConfiguration2.有自动配置了连接工厂 ConnectionFactory3.RabbitProperties 封装了RabbitMQ的配置4.R ...

  7. iOS开发本地推送

    1.简介 本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时.待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知. 2.创建UILocalNot ...

  8. Jmeter安装与配置(第一篇)

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动态资源,例如静态文 ...

  9. elasticsearch 中文API 获得(三)

    获取API 获取API允许你通过id从索引中获取类型化的JSON文档,如下例: GetResponse response = client.prepareGet("twitter" ...

  10. vs 快捷键 (空格显示 绿点, Tab 显示箭头)

    VS 快捷键 (空格显示 绿点, Tab 显示箭头)   VS 有用的快捷键 : Ctrl + r, ctrl + w, 切换空格示.