package cn.harmel.lucene;

import java.io.IOException;
import java.nio.file.Paths; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.classic.QueryParser.Operator;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.SortField.Type;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory; public class SearchIndex {
public static void main(String[] args) throws IOException, ParseException {
/*---------------------------------------------------------------------------------
* String queryString="title:\"美国\"";//包含“美国”
* String queryString="NOT title:\"美国\" AND title:\"国\"";//不包含 “美国” 但是包含 “国”
* String queryString="title:\"中\" AND title:\"国人\"";//即包含 “中” 又包含 ”国人“
* String queryString="title:\"张三\" OR title:\"李四\"";//包含 “张三” 或 ”李四“
* String queryString="id:[1 TO 5]";//查询 1<=id<=5
* String queryString="id:{1 TO 5}";//查询 1<id<5
* String queryString="title:\"中国\" AND NOT title:\"张三\" AND id:[1 TO 5]";
* String queryString="title:(中国 张三)";即包含 “中国” 又包含 ”张三“
---------------------------------------------------------------------------------*/
String queryString="title:\"中国\""; Analyzer analyzer = new StandardAnalyzer(); //StandardAnalyzer:汉字一个一个字拆分索引
IndexSearcher is = getIndexSearcher();
QueryParser parser=new QueryParser("", analyzer);
parser.setDefaultOperator(Operator.AND);//默认状态下,空格被认为是OR的关系,设置为空格为AND
Query query = parser.parse(queryString);
//排序
Sort sort = new Sort(new SortField("dt", Type.LONG, true));
TopDocs topDocs = is.search(query, 20,sort);
System.out.println("总共匹配多少个:" + topDocs.totalHits);
//获取查询结果集
ScoreDoc[] hits = topDocs.scoreDocs;
//遍历结果集
for (ScoreDoc scoreDoc : hits) {
Document document = is.doc(scoreDoc.doc);
System.out.println(document.get("id")+"-"+document.get("name")+"-"+document.get("dt")+"-"+document.get("title"));
}
closeIndexSearcher(is);
} /*
* 解决:实现实时搜索功能
* 解决:在读取索引文件内容时,索引文件的打开操作IndexSearcher是个非常耗时耗资源的操作
* */
private static byte[] synchronized_r = new byte[0];
private static SearcherManager searcherManager = null;
private static IndexSearcher getIndexSearcher() throws IOException {
IndexSearcher indexSearcher = null;
//保证在同一时刻最多只有一个线程执行该段代码
synchronized (synchronized_r) {
if(searcherManager == null) {
searcherManager = new SearcherManager(FSDirectory.open(Paths.get("E:\\LuceneIndex")), new SearcherFactory());
}
/*
* 这个方法同DirectoryReader.openIfChanged(dirReader)效果一样,其实底层还是调用的该方法实现的
* DirectoryReader.openIfChanged(dirReader)可以判断当前Reader对象的索引有没有被修改过
* 如果索引文件被更新过则重新加载该索引目录
* 但是这个时候的重新加载则比单纯的open(indexPath)要高效很多
* 它只是重新加载被更新过的文档,而单纯的open则是加载全部的文档
* */
searcherManager.maybeRefresh();
//借用一个IndexSearcher对象的引用,记住该对象用完之后要归还的,有借有还再借不难
indexSearcher = searcherManager.acquire();
}
return indexSearcher;
} private static void closeIndexSearcher(IndexSearcher indexSearcher) throws IOException {
if(indexSearcher != null) {
searcherManager.release(indexSearcher);//归还从SearcherManager处借来的IndexSearcher对象
}
indexSearcher = null;
}
}

  

第六步:Lucene查询索引(优化一)的更多相关文章

  1. Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  2. lucene查询索引之QueryParser解析查询——(八)

    0.语法介绍:

  3. lucene查询索引之Query子类查询——(七)

    0.文档名字:(根据名字索引查询文档)

  4. 搜索引擎学习(三)Lucene查询索引

    一.查询理论 创建查询:构建一个包含了文档域和语汇单元的文档查询对象.(例:fileName:lucene) 查询过程:根据查询对象的条件,在索引中找出相应的term,然后根据term找到对应的文档i ...

  5. Lucene查询索引

    索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...

  6. lucene查询索引库、分页、过滤、排序、高亮

    2.查询索引库 插入测试数据 xx.xx. index. ArticleIndex @Test public void testCreateIndexBatch() throws Exception{ ...

  7. 第六步:Lucene查询索引

    package cn.harmel.lucene; import java.io.IOException; import java.nio.file.Paths; import org.apache. ...

  8. Lucene查询索引(分页)

    分页查询只需传入每页显示记录数和当前页就可以实现分页查询功能 Lucene分页查询是对搜索返回的结果进行分页,而不是对搜索结果的总数量进行分页,因此我们搜索的时候都是返回前n条记录 package c ...

  9. mysql关联、子查询索引优化

    1.驱动表:加索引不起作用,因为全表扫描.表1 left join 表2 ,此时表1是驱动表 被驱动表:给这个加索引.  关联查询  子查询时 尽量不使用not in 或者not exists 而是用 ...

随机推荐

  1. how to combine jpg + separate alpha in png?

    http://www.tasharen.com/forum/index.php?topic=4018.msg19784#msg19784 I have tons of large sprites, I ...

  2. Yii2事件

    namespace app\components; use yii\base\Component; use yii\base\Event; class MessageEvent extends Eve ...

  3. nginx负载均衡的配置方法

    upstream www.***.com { server ; server ; server ; } server { listen ; server_name www.***.com; #char ...

  4. 面向对象分析设计-------02UML+UML各种图形及作用

    一.UML是什么?UML有什么用? 二.UML的历史 三.UML的上层结构(Superstructure) 四.UML建模工具 五.UML的图(重点) 1.用例图(use case diagram) ...

  5. Linux系统日志及日志分析

    Linux系统日志及日志分析   Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 大部分Linux发行版默认的日志守护进程为 syslog,位 ...

  6. [转]优化wp_head()

    经过对head的优化,我的博客访问速度也快了好多,在此过程中也了解到wp_head()模板函数的作用,可以再次优化,特此记录. 步骤:加入到function.phpremove_action(‘wp_ ...

  7. 移动前端调式页面--weinre

    一:远程调式工具---weinre 阅读目录 一:远程调式工具---weinre 二: 安装weinre 三: 访问weinre及在页面上调用 四:多用户 回到顶部 一:远程调式工具---weinre ...

  8. Altera的几个常用的Synthesis attributes

    各厂商综合工具,对HDL综合时都定义了一些综合属性这些属性可指定a declaration,a module item,a statement, or a port connection 不同的综合方 ...

  9. HDU 1025 Constructing Roads In JGShining's Kingdom(求最长上升子序列nlogn算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 解题报告:先把输入按照r从小到大的顺序排个序,然后就转化成了求p的最长上升子序列问题了,当然按p ...

  10. ZJOI Day 2 游记

    ---恢复内容开始--- 去ZJOI Day 2打了一会酱油...各种神犇大爷都来屠,南外的小朋友也来屠我们了真是感动...没有看到毛爷爷真是可惜.. Day[-1] 早上还在上课,吃完中饭立马跑去找 ...