2019独角兽企业重金招聘Python工程师标准>>>

对于IndexReader而言,反复使用Index.open打开会有很大的开销,所以一般在整个程序的生命周期中只会打开一个IndexReader,通过这个IndexReader来创建不同的IndexSearcher,如果使用单例模式,可能出现的问题有:

1、当使用Writer修改了索引之后不会更新信息,所以需要使用IndexReader.openIfChange方法操作

如果IndexWriter在创建完成之后,没有关闭,需要进行commit操作之后才能提交

public IndexSearcher getSearcher() {try {if(reader==null) {reader = IndexReader.open(directory);} else {IndexReader tr = IndexReader.openIfChanged(reader);if(tr!=null) {reader.close();reader = tr;}}return new IndexSearcher(reader);} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}

2、TermQuery查询

public void searchByTerm(String field,String name,int num) {try {IndexSearcher searcher = getSearcher();Query query = new TermQuery(new Term(field,name));TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByTerm() {su.searchByTerm("content","i",3);}

3、TermRangeQuery查询

public void searchByTermRange(String field,String start,String end,int num) {try {IndexSearcher searcher = getSearcher();Query query = new TermRangeQuery(field,start,end,true, true);TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByTermRange() {//查询name以a开头和s结尾的su.searchByTermRange("name","a","s",10);//由于attachs是数字类型,使用TermRange无法查询//su.searchByTermRange("attach","2","10", 5);}

4、NumericRangeQuery查询

public void searchByNumricRange(String field,int start,int end,int num) {try {IndexSearcher searcher = getSearcher();Query query = NumericRangeQuery.newIntRange(field,start, end,true,true);TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}  //测试方法@Testpublic void searchByNumRange() {su.searchByNumricRange("attach",2,10, 5);}

5、PrefixQuery查询

public void searchByPrefix(String field,String value,int num) {try {IndexSearcher searcher = getSearcher();Query query = new PrefixQuery(new Term(field,value));TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByPrefix() {su.searchByPrefix("content", "s", 10);}

注:我们在添加索引的时候的content是Field.Store.NO的

doc.add(new Field("content",contents[i],Field.Store.NO,Field.Index.ANALYZED));

6、WildcardQuery查询

public void searchByWildcard(String field,String value,int num) {try {IndexSearcher searcher = getSearcher();//在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符Query query = new WildcardQuery(new Term(field,value));TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}    //测试方法@Testpublic void searchByWildcard() {//匹配@itat.org结尾的所有字符su.searchByWildcard("email", "*@itat.org", 10);System.out.println("=======================================");//匹配j开头的有三个字符的namesu.searchByWildcard("name", "j???", 10);}

7、BooleanQuery查询

public void searchByBoolean(int num) {try {IndexSearcher searcher = getSearcher();BooleanQuery query = new BooleanQuery();/** BooleanQuery可以连接多个子查询* Occur.MUST表示必须出现* Occur.SHOULD表示可以出现* Occur.MUSE_NOT表示不能出现*/query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByBoolean() {su.searchByBoolean(10);}

将query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);设置为query.add(new TermQuery(new Term("name","zhangsan")), Occur.SHOULD);

8、PhraseQuery查询

private String[] contents = {"welcome to visited the space,I like book","hello boy, I like pingpeng ball","my name is cc I like game","I like football","I like football and I like basketball too","I like movie and swim"};
public void searchByPhrase(int num) {try {IndexSearcher searcher = getSearcher();PhraseQuery query = new PhraseQuery();query.setSlop(3);query.add(new Term("content","pingpeng"));//第一个Termquery.add(new Term("content","i"));//产生距离之后的第二个TermTopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByPhrase() {su.searchByPhrase(10);}

9、FuzzyQuery查询

public void searchByFuzzy(int num) {try {IndexSearcher searcher = getSearcher();FuzzyQuery query = new FuzzyQuery(new Term("name","mase"),0.4f,0);System.out.println(query.getPrefixLength());System.out.println(query.getMinSimilarity());TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date"));}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法@Testpublic void searchByFuzzy() {su.searchByFuzzy(10);}

10、QueryParse查询

public void searchByQueryParse(Query query,int num) {try {IndexSearcher searcher = getSearcher();TopDocs tds = searcher.search(query, num);System.out.println("一共查询了:"+tds.totalHits);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(doc.get("id")+"---->"+doc.get("name")+"["+doc.get("email")+"]-->"+doc.get("id")+","+doc.get("attach")+","+doc.get("date")+"=="+sd.score);}searcher.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//测试方法 @Testpublic void searchByQueryParse() throws ParseException {//1、创建QueryParser对象,默认搜索域为contentQueryParser parser = new QueryParser(Version.LUCENE_35, "content", new StandardAnalyzer(Version.LUCENE_35));//改变空格的默认操作符,以下可以改成AND//parser.setDefaultOperator(Operator.AND);//开启第一个字符的通配符匹配,默认关闭因为效率不高parser.setAllowLeadingWildcard(true);//搜索content中包含有like的Query query = parser.parse("like");//有basketball或者football的,空格默认就是ORquery = parser.parse("basketball football");//改变搜索域为name为mike//query = parser.parse("content:like");//同样可以使用*和?来进行通配符匹配
//      query = parser.parse("name:j*");//通配符默认不能放在首位
//      query = parser.parse("email:*@itat.org");//匹配name中没有mike但是content中必须有football的,+和-要放置到域说明前面query = parser.parse("- name:mike + like");//匹配一个区间,注意:TO必须是大写//query = parser.parse("id:[1 TO 6]");//闭区间匹配只会匹配到2//query = parser.parse("id:{1 TO 3}");//完全匹配I Like Football的//query = parser.parse("\"I like football\"");//匹配I 和football之间有一个单词距离的//query = parser.parse("\"I football\"~1");//模糊查询//query = parser.parse("name:make~");//没有办法匹配数字范围(自己扩展Parser)//query = parser.parse("attach:[2 TO 10]");su.searchByQueryParse(query, 10);}

11、分页查询

/*** 根据页码和分页大小获取上一次的最后一个ScoreDoc*/private ScoreDoc getLastScoreDoc(int pageIndex,int pageSize,Query query,IndexSearcher searcher) throws IOException {if(pageIndex==1)return null;//如果是第一页就返回空int num = pageSize*(pageIndex-1);//获取上一页的数量TopDocs tds = searcher.search(query, num);return tds.scoreDocs[num-1];}
public void searchPageByAfter(String query,int pageIndex,int pageSize) {try {Directory dir = FileIndexUtils.getDirectory();IndexSearcher searcher = getSearcher(dir);QueryParser parser = new QueryParser(Version.LUCENE_35,"content",new StandardAnalyzer(Version.LUCENE_35));Query q = parser.parse(query);//先获取上一页的最后一个元素ScoreDoc lastSd = getLastScoreDoc(pageIndex, pageSize, q, searcher);//通过最后一个元素搜索下页的pageSize个元素TopDocs tds = searcher.searchAfter(lastSd,q, pageSize);for(ScoreDoc sd:tds.scoreDocs) {Document doc = searcher.doc(sd.doc);System.out.println(sd.doc+":"+doc.get("path")+"-->"+doc.get("filename"));}searcher.close();} catch (org.apache.lucene.queryParser.ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
@Testpublic void testSearchPage02() {for(int i=1;i<7;i++){su.searchPageByAfter("java", i,10);System.out.println("==========================================");}}

转载于:https://my.oschina.net/heroShane/blog/202459

Lucene知识小总结8:索引查询相关推荐

  1. Lucene知识小总结4:索引的反删除

    2019独角兽企业重金招聘Python工程师标准>>> IndexReader提供了一个有时非常有用的方法undeleteAll,该方法能反向操作索引中所有被挂起的删除.需要注意的是 ...

  2. Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索

    Lucene 的四大索引查询   清单1:使用布尔操作符 Java代码      //Test boolean operator blic void testOperator(String index ...

  3. 【知识小课堂】4 之 索引

    索引类型 mongoDB 的索引在存储结构都是一样的,但是根据不同的应用需求,还是分成了:唯一索引,稀疏索引,复合索引 1.唯一索引 MONGODB 在默认建立文档时,都会自动添加一个:"_ ...

  4. 论文小综 | 知识图谱中的复杂查询问答

    作者 | 张文,浙江大学博士,研究兴趣为知识图谱表示与推理 陈名杨,浙江大学在读博士生,研究兴趣为知识图谱表示与推理 本文将介绍近两年4篇关于知识图谱中的复杂查询问答(Complex Query An ...

  5. 【知识小课堂】 mongodb 之 objectId

    一.OBJECTID 因公司开发人员在使用MONGODB时,总遇到一些小问题.为了增加大家的mongodb 数据库知识. 决定每周进行一.两次的知识小课堂.这里把内容整理出来,上传到博客中.也算是自己 ...

  6. Java多线程知识小抄集(二)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. 【知识图谱】(task3)知识图谱的存储和查询

    note 用图数据库的场景: 高性能关系查询:需要快速遍历许多复杂关系的任何用例,如欺诈检测,社交网络分析,网络和数据库基础设施等: 模型的灵活性:任何依赖于添加新数据而不会中断现有查询池的用例.模型 ...

  8. ES的跨索引查询有多便利?对比下分库分表、分片更直观

    作者介绍 李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发.架构.运维等方面有深入体验,实践 ...

  9. 阿里深资架构师整理的Java 基础知识小抄 赶紧收藏

    本篇算是 Java 的基础知识小抄吧,之所以说小抄是因为觉得涵盖不是很细很全,但是基本的内容都有,当然后头还会继续完善,只是不会再用笔记录了!按照现在的习惯,先附上一张思维导图: 1. 安装与环境配置 ...

  10. 怎么提高大表和小表的连接查询效率?

    怎么提高大表和小表的连接查询效率? 我想到会不会和大表和小表的前后顺序有关系. 小表优先能极大减少比对次数 效率更好 例子: a表10条记录 b表10000条记录 连接条件是a.id = b.id 假 ...

最新文章

  1. 今晚8点开播 | 思必驰NLP大牛带你系统学习启发式对话
  2. 一片很好的关于感情的文章
  3. python迅雷远程下载页面_【教程】Chrome浏览器添加迅雷下载支持
  4. php7 编译参数详解,php7.4.5编译安装参数变更
  5. FullCalendar插件月视图正常显示周视图不正常显示问题解决方法
  6. SharePoint 2007 做Migration后用户处理
  7. 【Part1】用JS写一个Blog(node + vue + mongoDB)
  8. poj 3666 河南省第七届程序设计D题(山区修路)
  9. vscode下报错:No such file or directory fatal error:no input files的一种比较坑爹的可能
  10. 1000道Python题库系列分享三(30道)
  11. Java 编程语言单词汇总
  12. IBM P系列小型机HMC默认IP地址
  13. 【愚公系列】2022年07月 Go教学课程 004-Go代码注释
  14. Win10 官方版下载地址 windows10 1909微软原版光盘镜像下载
  15. 通达信口袋支点选股公式,选出口袋支点形态
  16. linux下使用磁带备份
  17. 【Git】git pull和git pull --rebase的使用
  18. 只有那些疯狂到以为自己能够改变世界的人, 才能真正的改变世界
  19. 程序员应该知道的10大编程格言
  20. python读取身份证照片信息_20行代码教你用Python改变身份证照片的背景色,python,给,证件照,换,底色...

热门文章

  1. [RN] React Native 解决 使用 阿里巴巴 矢量图标库 iconfont 图标不垂直居中问题
  2. 第二章:循环结构程序设计
  3. 博客园 编程基础 精华
  4. wire routing 网格寻址
  5. JS定义数组,初始化
  6. 直线算法(Bresenham)
  7. ORB-SLAM2双目开源框架 (2) Tracking解析
  8. (ZT)算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
  9. ubuntu 16.04安装并启动openssh
  10. KICKSTART无人值守安装系统