006 lucene在java里增删改查(用query子类查询)-尊龙官方平台

006 lucene在java里增删改查(用query子类查询)

el/2024/3/25 17:40:35

先放出两个工具方法:获取indexwriter和indexreader对象

/*** 获取一个指定路径indexwriter对象** @param path 指定路径* @return* @throws exception*/
private indexwriter getindexwriter(string path) throws exception {//创建indexwriter对象,4.10.3的与7.6.0创建方式都不一样directory directory = fsdirectory.open(new file(path));analyzer analyzer = new ikanalyzer();//使用ik中文分词器indexwriterconfig indexwriterconfig = new indexwriterconfig(version.latest, analyzer);return new indexwriter(directory, indexwriterconfig);
}/*** 获取一个指定路径indexreader对象** @param path* @return* @throws exception*/
private indexreader getindexreader(string path) throws exception {//创建directory对象,打开索引库的位置,4.10.3的与7.6.0创建方式都不一样directory directory = fsdirectory.open(new file(path));//创建indexreader对象,打开索引库return directoryreader.open(directory);
}

删除操作:

/*** 删除指定索引库的全部索引*/
public void alldelete() throws exception {indexwriter indexwriter = this.getindexwriter("d:\\lucene-4.10.3\\blacktv_demo\\demo");indexwriter.deleteall();indexwriter.close();
}
/*** 根据条件删除指定索引库的索引*/
public void delete() throws exception {indexwriter indexwriter = this.getindexwriter("d:\\lucene-4.10.3\\blacktv_demo\\demo");//删除filecontent域中含有宇智波term的索引query query = new termquery(new term("filecontent","宇智波"));indexwriter.deletedocuments(query);indexwriter.close();
}

修改操作,lucene的修改操作难用的一批,基本用不到的:

/*** lucene的修改有点与众不同,与其说是修改,不如说是添加与删除的结合体,不老好用的** @throws exception*/
public void update() throws exception {indexwriter indexwriter = this.getindexwriter(index_url);document document = new document();//要添加的内容document.add(new textfield("updatetest1", "更新操作添加的玩意1", field.store.yes));document.add(new textfield("updatetest2", "更新操作添加的玩意2", field.store.yes));document.add(new textfield("updatetest3", "更新操作添加的玩意3", field.store.yes));//删除filename域中包含火影这个term的,并添加三个新的内容indexwriter.updatedocument(new term("filename", "火影"), document);indexwriter.close();
}

连续查询会用到occur这个枚举,类似于sql查询的and、or、not

1.must和must:取得连个查询子句的交集。
2.must和must_not:表示查询结果中不能包含must_not所对应得查询子句的检索结果。
3.should与must_not:连用时,功能同must和must_not。
4.should与must连用时,结果为must子句的检索结果,但是should可影响排序。
5.should与should:表示“或”关系,最终检索结果为所有检索子句的并集。
6.must_not和must_not:无意义,检索无结果。

查询(无条件查询、多条件查询、数值范围查询):

/*** 无条件查询*/
public void searchall() throws exception {indexreader indexreader = this.getindexreader(index_url);//创建indexsearcher对象indexsearcher indexsearcher = new indexsearcher(indexreader);//创建查询对象,查询全部query query = new matchalldocsquery();this.printresult(indexsearcher, query, 10);//执行查询,取前10条查询结果,并打印//关闭流indexreader.close();
}/*** 精准查询案例** @throws exception*/
public void search() throws exception {indexreader indexreader = this.getindexreader(index_url);//创建indexsearcher对象indexsearcher indexsearcher = new indexsearcher(indexreader);//创建查询对象,查询域为文件内容,关键字为宇智波query query = new termquery(new term("filecontent", "宇智波"));this.printresult(indexsearcher, query, 3);//执行查询,取前3条结果,并打印//关闭流indexreader.close();
}/*** 组合查询,可以设置多个查询条件*/
public void booleanquery()throws exception{indexreader indexreader = this.getindexreader(index_url);//创建indexsearcher对象indexsearcher indexsearcher = new indexsearcher(indexreader);//创建组合查询对象,可以添加多个查询条件booleanquery query = new booleanquery();//查询filecontent域里包含鸣人term,不包含我爱罗termquery.add(new termquery(new term("filecontent", "鸣人")), booleanclause.occur.must);query.add(new termquery(new term("filecontent", "我爱罗")), booleanclause.occur.must_not);this.printresult(indexsearcher, query, 3);//执行查询,取前3条结果,并打印//关闭流indexreader.close();
}/*** 根数数值范围查询*/
public void numberquery() throws exception {indexreader indexreader = this.getindexreader(index_url);//创建indexsearcher对象indexsearcher indexsearcher = new indexsearcher(indexreader);//创建查询对象,查询3000~4400bit的索引,包含最小值和最大值,filesize域创建时用的long查询选择类为longquery query = numericrangequery.newlongrange("filesize", 3000l, 4400l, true, true);this.printresult(indexsearcher, query, 5);//执行查询,取前5条结果,并打印//关闭流indexreader.close();
}/*** 执行查询并打印查询结果** @param indexsearcher* @param query* @param number        取多少条结果* @throws exception*/
public void printresult(indexsearcher indexsearcher, query query, int number) throws exception {topdocs topdocs = indexsearcher.search(query, number);//取前number条结果//获取查询结果,遍历打印scoredoc[] scoredocs = topdocs.scoredocs;for (scoredoc scoredoc : scoredocs) {system.out.println("文档id:"   scoredoc.doc);//根据文档id获取文档对象document document = indexsearcher.doc(scoredoc.doc);system.out.println("文件名:"   document.get("filename"));system.out.println("文件大小:"   document.get("filesize"));system.out.println("文件路径:"   document.get("filepath"));//            system.out.println("文件内容:"   document.get("filecontent"));//内容太多就不打印出来了system.out.println("----------------------------------------------------------------------------------");system.out.println("----------------------------------------------------------------------------------");}
}

 


http://www.ngui.cc/el/5127332.html

相关文章

007 lucene解析查询(与用query子类查询等效)

1、基础的查询语法,关键词查询:域名“:”搜索的关键字 content:java //查询content域里带有java这个term的 2、范围查询,域名“:”[最小值to 最大值],范围查询在lucene中不支持数值类型,支持字符串类型。在…

001 windows下搭建nginx与启停

nginx的下载和安装非常简单,直接在http://nginx.org/en/download.html下载对应的平台版本即可,该文档在windows下进行的(事实上对于nginx的安装和简单配置来说,windows和linux并没有太大异同),下载的nginx版…

001.1 linux下安装nginx并设开机自启

nginx主要有三种版本:mainline version\stable version\legacy versions,在生产环境最好使用stable版本(稳定版),如图所示 下载地址: http://nginx.org/en/download.html 先安装依赖项: yum -y install p…

001.2 按天分割nginx日志,删除20天前日志

nginx会把每天的日志记录到同一个日志文件acess.log中,自身没有提供每天生成一个日志文件功能。我们要通过一个shell脚本每天定时执行可实现按天分割日志文件。 编写脚本文件: vi /usr/local/nginx/sbin/cut-log.sh#!/bin/bash ## 零点执行该脚本 ## n…

003 nginx配置文件

这里对nginx的配置文件进行简单介绍,nginx的配置文件中配置项有两种结构 简单指令:形如key value 块指令:形如key {simple_key simple_value;} 块指令中包含有简单指令,像是json,但又不是json 例如: worke…

004 配置nginx作为反向代理服务器

nginx经常作为代理服务器,作为代理的访问逻辑如下图: 这里将tvacg项目作为目标webserver,首先将配置文件的http{}块中追加以下内容 server {listen 6904;location / {proxy_pass http://47.101.194.203/;} } server{listen 6904;}表明启动一…

005 nginx实现负载均衡

先用最简单的weight轮询(默认)方式来实现负载均衡,设置的权重值越高被访问到的几率就越高,47.101.194.203是tvacg项目的,另一个是我在本地跑的项目。 upstream与proxy_pass指向域名的情况 worker_processes 1; events {worker_connections…

006 nginx集群

学nginx集群之前要先搞明白负载均衡是怎样分层的,我个人总结的经验是层数越靠上性能必须越高。如图所示,客户的请求由一台lvs服务器转发到nginx服务器1~3,这样能减轻nginx服务器1~3的压力,但是所有的请求都会经过lvs服务器&#x…

007 nginx限制访问频率

nginx对于预防一些攻击也是很有效的,例如cc攻击,爬虫,本文将介绍限制这些攻击的方法,可以使用nginx的ngx_http_limit_conn_module、ngx_http_limit_req_module这两个模块达到目的,该模块为nginx内置模块,yu…

008 nginx内置变量

内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的所有内置变量: $arg_name…
网站地图