最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了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实现在一个(或者多个)字段中查找多个关键字相关推荐

  1. 在多选用户字段中查找是否存在某个用户(转自JianYi博客)

    多选用户字段的Caml查询问题 转自jianyi博客: 有朋友问:有个列表有个多选用户列,想判断当前用户是否在这个列中包含,怎么写CAML也写不出来,能否帮忙. 这个问题我也不知道,但想到任务列表中有 ...

  2. 订单 图片(一对多关系),地址保存在一个字段中(Json数组对象格式)

    订单---->图片(一对多关系),地址保存在一个字段中(Json数组对象格式) 1.前端列表动态添加: jsp:<form id="postForm" method=& ...

  3. mysql字段中有逗号隔开_在MySQL字段中使用逗号分隔符

    大多数开发者应该都遇到过在mysql字段中存储逗号分割字符串的经历,无论这些被分割的字段代表的是id还是tag,这个字段都应该具有如下几个共性.被分割的字段一定是有限而且数量较少的,我们不可能在一个字 ...

  4. 上传图片至服务器,写入到数据库Blob字段中,以及从数据库读取Blob信息(iframe父子页面传值)(1)

    最近做了个用户维护功能,涉及到照片的操作. 照片是存到数据库oracle中的Blob字段中. 难点有两个: 1,图片的上传:2,Blob字段的读取. 先说图片的上传吧, 我使用common-fileu ...

  5. Elasticsearch:使用新的 wildcard 字段更快地在字符串中查找字符串 - 7.9 新功能

    在 Elasticsearch 7.9 中,我们将引入一种新的 "wildcard" 字段类型,该字段类型经过优化,可在字符串值中快速查找模式.这种新的字段类型采用了一种全新的方式 ...

  6. mysql之设置字段分隔符_mysql字段中使用逗号分隔符

    被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符 这个字段所属的表与这个字段关联的表,一定是一对多的关系 比如下面这个表结构所代表的content与tag这两个对象 代码 ...

  7. SQL查询一个表中类别字段中Max()最大值对应的记录

    问题是: 数据库有一个表 code,里面有个点击量字段click_num和一个类别字段kind以及其它信息字段, 现在要搜出每个类别中点击量最大的那条记录,如果是10个类别,那么结果应该是10条记录, ...

  8. lighthouse_Laravel中的GraphQL做得正确:如何在一个简单的博客中设置Lighthouse

    lighthouse by Oliver Nybroe 由Oliver Nybroe Laravel中的GraphQL做得正确:如何在一个简单的博客中设置Lighthouse (GraphQL in ...

  9. MySQL导出数据反单引号_使用mysqldump导出数据时对字段中包含的单引号的处理

    最近在做一个日志统计项目,有一个辅助表是在MySQL数据库的,现在要将其迁移到Postgresql,自然是先用mysqldump将MySQL里面的数据导出,然后再导入到Postgresql即可.但在实 ...

最新文章

  1. PowerDesigner生成数据库
  2. HTML输入 - 名称与ID
  3. IJ中 运行tomcat 配置
  4. 解决git下载出现:Failed to connect to 127.0.0.1 port 1080: Connection refused拒绝连接错误
  5. 如何使用yum来下载RPM包而不进行安装
  6. 使用Java第2部分查询DynamoDB项
  7. leetcode132. 分割回文串 II
  8. python numpy Quickstart tutorial之set_printoptions
  9. 功率谱 魏凤英统计程序_单通道语音增强之统计信号模型
  10. java虚拟机文件_JAVA虚拟机已经安装,但不知道在哪儿编译和运行程序。
  11. MFC vs2012 Office2013 读写excel文件
  12. HBase在新能源汽车监控系统中的应用
  13. 极化码的巴氏参数构造算法
  14. 装逼技能:怎样优雅地摆放桌面图标?
  15. JavaScript语法引用数据类型之函数(Fuction)
  16. 计算机进入不了管理器,电脑没有桌面且任务管理器打不开怎么办
  17. 华为 MA5680T [EPON]简单开局
  18. ih5手机版怎么登录服务器未响应,ih5 与服务器链接教程
  19. 一个DIV的芝士汉堡制作
  20. 解决win10蓝牙搜索到小爱音箱无法连接问题

热门文章

  1. VTK:可视化之CreateColorSeries
  2. VTK:可视化之LabelPlacementMapper
  3. VTK:PolyData之CopyAllArrays
  4. VTK:Points之FitImplicitFunction
  5. OpenCV梯度结构张量的各向异性图像分割
  6. C语言用warshall算法求传递闭包transitive closure(附完整源码)
  7. 8.非关系型数据库(Nosql)之mongodb的应用场景(关系型数据库 和 Mongodb进行CRUD时数据用时的比较)
  8. 最全的IO操作知识总结
  9. ubunto用户切换
  10. 修改数据库文件为自动扩展以达到表空间自动扩展的目的