首页 > 其他分享 >DotLucene搜索索引(上)

DotLucene搜索索引(上)

时间:2023-07-03 20:31:51浏览次数:35  
标签:startAt string Results DotLucene 索引 搜索 path dr

主要就两个方法,一个search()方法,主要是显示当前页的搜索记录

1
protected void search()
2
    
{
3
         DateTime start = DateTime.Now;//搜索的开始时间
4
        //得到索引所在的目录,我们在上个console程序里把索引放到了index目录下
5
        string indexDirectory = Server.MapPath("index");
6
        //创建个索引搜索器
7
         IndexSearcher searcher = new IndexSearcher(indexDirectory);
8
        //分词并解析索引的text字段以便搜索
9
         Query thisQuery = QueryParser.Parse(this.Query,"text",new StandardAnalyzer());
10
        //为要绑定输出到页面的results建立几列
11
        this.Results.Columns.Add("path",typeof(string));
12
        this.Results.Columns.Add("sample",typeof(string));
13
        this.Results.Columns.Add("title",typeof(string));
14
        //开始搜索
15
         Hits hits = searcher.Search(thisQuery);
16
        //得到搜索返回的记录总数
17
        this.total = hits.Length();
18
        //创建一个高亮
19
         QueryHighlightExtractor highlighter = new QueryHighlightExtractor(thisQuery, new StandardAnalyzer(), "<B>", "</B>");
20
        //初始化startAt,以便得到要显示的结果集
21
        this.startAt = initStartAt();
22
        //得到当前页要显示的记录数量,包括以前所有页的记录数,这样把他与this.startAt结合就能够很好的知道当前页要显示的记录数了
23
        int resultsCount = smallOf(this.total,this.startAt+this.maxResults);
24
        //开始循环得到当前页要显示的记录
25
        for (int i = this.startAt; i < resultsCount; i++)
26
        
{ 
27
           //得到每一行Hits的Document,因为Hits的没一行都是个Document对象
28
             Document doc = hits.Doc(i);
29
            //得到doc里面的列path的值
30
            string path = doc.Get("path");
31
            //再得到这个路径在web程序的路径,我们原来把文档放到了web根目录的documents目录下的
32
            string location = Server.MapPath(@"documents\"+path);
33
            //用StreamReader读取文档,因为我们不能够直接从索引中得到text字段的值,因为我们建立索引的时候没有存储他的
34
            string plainText;
35
            using (StreamReader sr = new StreamReader(location, System.Text.Encoding.Default))
36
            
{
37
                 plainText = ParseHtml(sr.ReadToEnd());
38
             }
39
            //为结果集DataTable,Results添加个新行
40
             DataRow dr = this.Results.NewRow();
41
             dr["title"] = doc.Get("title");
42
             dr["path"] = @"documents/" + path;
43
             dr["sample"] = highlighter.GetBestFragment(plainText,80);
44
            //把行添加进DataTable
45
            this.Results.Rows.Add(dr);
46
         }
47
        //循环完毕,关闭搜索
48
         searcher.Close();
49
        //搜索花费多少时间
50
        this.duration = DateTime.Now - start;
51
        //给fromItem赋值,他总是startAt+1
52
        this.fromItem = this.startAt + 1;
53
        //给toItem赋值
54
        this.toItem = smallOf(this.total,this.startAt+this.maxResults);
55

56
     }


作者:古道轻风




标签:startAt,string,Results,DotLucene,索引,搜索,path,dr
From: https://blog.51cto.com/chunyangi/6615248

相关文章

  • mysql的update更新及delete删表记录where不带索引字段导致死锁
    为什么会发生这种的事故?InnoDB存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。因此InnoDB存储引擎自己实现了行锁,通过......
  • 数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。
    数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘。图算法,搜索算法等算法码源见文末1.算法目录18大DM算法包名目录名算法名AssociationAnalysisDataMining_AprioriApriori-关联规则挖掘算法AssociationAnalysisDataMining_FP......
  • 利用Lucene.net搜索引擎进行多条件搜索的做法
    利用Lucene.net搜索引擎进行多条件搜索的做法1联合两个索引查询,已解决:IndexSearcher[]searchers=newIndexSearcher[2];  searchers[0]=newIndexSearcher(m_indexpath);searchers[1]=newIndexSearcher(m_outindexpath);MultiSearchermultiSearcher=newMult......
  • 0623搜索专题-F题
    题目描述:  读完题目大家有思路了吗?反正我有了:哪个**闲的没事干这b玩意,****。整体思路算是比较暴力,就是将这个四位数的每一位都拆解开来,让每位都从0-9挨个换一遍,组成一个新的数字再将其判断是否为质数。一个小坑:任意数字的首位不得为0,代码里特判一下就好。想到这,思路就很清......
  • MySql —— 数据页与索引
    数据库的I/O操作的最小单位是页,InnoDB数据页的默认大小是16KB,意味着数据库每次读写都是以16KB为单位的,一次最少从磁盘中读取16K的内容到内存中,一次最少把内存中的16K内容刷新到磁盘中。数据页包括七个部分       在FileHeader中有两个指针,分别指向上......
  • 【numpy基础】--数组索引
    数组索引是指在numpy数组中引用特定元素的方法。numpy的数组索引又称为fancyindexing,比其他编程语言的索引强大很多。1.选取数据numpy的索引除了像其他语言一样选择一个元素,还可以间隔着选取多个元素,也可以用任意的顺序选取元素。比如一维数组:arr=np.random.randint(0,10......
  • Python 满足列中任意两个数之和等于目标值,输出这两个数的值和所在列表的索引值
    给定一个列表为nums=[2,7,11,15],目标值target=9,找出列表中任意2数之和等于9的元素以及所在位置思路:双重遍历去一对一的比较判断1nums=[2,7,11,15,1,8,2]2target=93list_new=[]4deffind_num_indx():56foriinrange(len(nums)):......
  • MySql —— 索引
    可以按照四个角度来分类索引。按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)。按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引。按「字段个数」分类:单列索引、联合索引。按数据结构分类 ......
  • 【Python基础】index函数-返回查找对象的首个匹配的索引位置
    描述从列表中找出某个值第一个匹配项的索引位置返回的是查找对象的索引位置,如果没有,就会抛出异常语法List.index(a,start,end)参数解释a要查找的对象(必填)start要查找的范围的开始位置索引(闭区间)(非必填)end要查找的范围的结束位置索引(开区间)(有end就必须有start,有start时可以没end)举......
  • 使用uni.app 里面 uni.chooseLocation api 打开地图位置 踩坑 踩坑 地图搜索 和列
    用 Android基座可以正常使用真机调试也可以用就是打包的时候打包完毕弹出地图之后搜索一直转圈  地图列表没有东西也是一直转圈里面有好多踩坑点  太狗了  要打包的 包名  和 dcloud里面的包名 和如果用高德地图里面的  packagename三......