用lucene实现在一个(或者多个)字段中查找多个关键字
最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了Lucene的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。
1.Lucene说明
Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。
Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。
可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。
2.用Lucene实现在一个或者多个字段中的检索
主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer);
1)query:要查找的字符串数组
2)field:要查找的字符串数组对应的字段(当然有可以相同的)
3)occ:表示对应字段的限制。有三种:Occur.MUST(结果“与”), Occur.MUST_NOT(结果“差”),Occur.SHOULD(结果“或”)
4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致
3.代码示例
下面这个程序可以实现在一个字段“contents”中查找多个关键字。稍加修改也可以在多个字段查找多个关键字。
import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query;public class MultiPhraseQuerySearcher {private static String indexPath = "E:\\Lucene\\index"; // 索引保存目录public static void createIndex(){ // 建立索引 IndexWriter writer;try {writer = new IndexWriter(indexPath,new StandardAnalyzer(),true);Field fieldB1 = new Field("contents","今晚的辩题很道地:在我们这些人当中?",Field.Store.YES,Field.Index.TOKENIZED);Field fieldB2 = new Field("contents","我们为电影《今朝》是一部不错的影片。",Field.Store.YES,Field.Index.TOKENIZED);Field fieldB3 = new Field("contents","我们到底是啥意思呢?",Field.Store.YES,Field.Index.TOKENIZED);Document doc1 = new Document();Document doc2 = new Document();Document doc3 = new Document();doc1.add(fieldB1);doc2.add(fieldB2);doc3.add(fieldB3);writer.addDocument(doc1);writer.addDocument(doc2);writer.addDocument(doc3);writer.close();} catch (Exception e) {e.printStackTrace();} }public static void main(String[] args) { //contests字段上查找含有"我们","今晚"这两个字段的Doument Query query;IndexSearcher searcher;try {//生成索引 createIndex();searcher = new IndexSearcher(indexPath);//要查找的字符串数组String [] stringQuery={"我们","今晚"};//待查找字符串对应的字段String[] fields={"contents","contents"};//Occur.MUST表示对应字段必须有查询值, Occur.MUST_NOT 表示对应字段必须没有查询值Occur[] occ={Occur.MUST,Occur.MUST};query=MultiFieldQueryParser.parse(stringQuery,fields,occ,new StandardAnalyzer()); Hits hits = searcher.search(query);for(int i=0;i<hits.length();i++)System.out.println("Document内容为 : "+hits.doc(i));System.out.println("共检索出符合条件的Document "+hits.length()+" 个。");} catch (Exception e) {} } }
转载于:https://www.cnblogs.com/xudong-bupt/archive/2013/05/08/3065297.html
用lucene实现在一个(或者多个)字段中查找多个关键字相关推荐
- 在多选用户字段中查找是否存在某个用户(转自JianYi博客)
多选用户字段的Caml查询问题 转自jianyi博客: 有朋友问:有个列表有个多选用户列,想判断当前用户是否在这个列中包含,怎么写CAML也写不出来,能否帮忙. 这个问题我也不知道,但想到任务列表中有 ...
- 订单 图片(一对多关系),地址保存在一个字段中(Json数组对象格式)
订单---->图片(一对多关系),地址保存在一个字段中(Json数组对象格式) 1.前端列表动态添加: jsp:<form id="postForm" method=& ...
- mysql字段中有逗号隔开_在MySQL字段中使用逗号分隔符
大多数开发者应该都遇到过在mysql字段中存储逗号分割字符串的经历,无论这些被分割的字段代表的是id还是tag,这个字段都应该具有如下几个共性.被分割的字段一定是有限而且数量较少的,我们不可能在一个字 ...
- 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(1)
最近做了个用户维护功能,涉及到照片的操作. 照片是存到数据库oracle中的Blob字段中. 难点有两个: 1,图片的上传:2,Blob字段的读取. 先说图片的上传吧, 我使用common-fileu ...
- Elasticsearch:使用新的 wildcard 字段更快地在字符串中查找字符串 - 7.9 新功能
在 Elasticsearch 7.9 中,我们将引入一种新的 "wildcard" 字段类型,该字段类型经过优化,可在字符串值中快速查找模式.这种新的字段类型采用了一种全新的方式 ...
- mysql之设置字段分隔符_mysql字段中使用逗号分隔符
被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符 这个字段所属的表与这个字段关联的表,一定是一对多的关系 比如下面这个表结构所代表的content与tag这两个对象 代码 ...
- SQL查询一个表中类别字段中Max()最大值对应的记录
问题是: 数据库有一个表 code,里面有个点击量字段click_num和一个类别字段kind以及其它信息字段, 现在要搜出每个类别中点击量最大的那条记录,如果是10个类别,那么结果应该是10条记录, ...
- lighthouse_Laravel中的GraphQL做得正确:如何在一个简单的博客中设置Lighthouse
lighthouse by Oliver Nybroe 由Oliver Nybroe Laravel中的GraphQL做得正确:如何在一个简单的博客中设置Lighthouse (GraphQL in ...
- MySQL导出数据反单引号_使用mysqldump导出数据时对字段中包含的单引号的处理
最近在做一个日志统计项目,有一个辅助表是在MySQL数据库的,现在要将其迁移到Postgresql,自然是先用mysqldump将MySQL里面的数据导出,然后再导入到Postgresql即可.但在实 ...
最新文章
- PowerDesigner生成数据库
- HTML输入 - 名称与ID
- IJ中 运行tomcat 配置
- 解决git下载出现:Failed to connect to 127.0.0.1 port 1080: Connection refused拒绝连接错误
- 如何使用yum来下载RPM包而不进行安装
- 使用Java第2部分查询DynamoDB项
- leetcode132. 分割回文串 II
- python numpy Quickstart tutorial之set_printoptions
- 功率谱 魏凤英统计程序_单通道语音增强之统计信号模型
- java虚拟机文件_JAVA虚拟机已经安装,但不知道在哪儿编译和运行程序。
- MFC vs2012 Office2013 读写excel文件
- HBase在新能源汽车监控系统中的应用
- 极化码的巴氏参数构造算法
- 装逼技能:怎样优雅地摆放桌面图标?
- JavaScript语法引用数据类型之函数(Fuction)
- 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
- 华为 MA5680T [EPON]简单开局
- ih5手机版怎么登录服务器未响应,ih5 与服务器链接教程
- 一个DIV的芝士汉堡制作
- 解决win10蓝牙搜索到小爱音箱无法连接问题
热门文章
- VTK:可视化之CreateColorSeries
- VTK:可视化之LabelPlacementMapper
- VTK:PolyData之CopyAllArrays
- VTK:Points之FitImplicitFunction
- OpenCV梯度结构张量的各向异性图像分割
- C语言用warshall算法求传递闭包transitive closure(附完整源码)
- 8.非关系型数据库(Nosql)之mongodb的应用场景(关系型数据库 和 Mongodb进行CRUD时数据用时的比较)
- 最全的IO操作知识总结
- ubunto用户切换
- 修改数据库文件为自动扩展以达到表空间自动扩展的目的