Lucene

API

Document

Document:文档对象,是一条原始数据

文档编号 文档内容
1 谷歌地图之父跳槽FaceBook
2 谷歌地图之父加盟FaceBook
3 谷歌地图创始人拉斯离开谷歌加盟Facebook
4 谷歌地图之父跳槽Facebook与Wave项目取消有关
5 谷歌地图之父拉斯加盟社交网站Facebook

==一条记录就是一个document,document的每一个字段就是一个Field==

Field

创建索引

private final static File INDEX_FILE = new File("E:\\DevelopTools\\indexDir");

public static void indexCreate(Document doc) throws Exception {
    // 创建目录对象,指定索引库的存放位置;FSDirectory文件系统;RAMDirectory内存
    Directory dir = FSDirectory.open(INDEX_FILE);
    // 创建分词器对象
    Analyzer analyzer = new IKAnalyzer();
    // 创建索引写入器配置对象,第一个参数版本VerSion.LATEST,第二个参数分词器
    IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
    // 创建索引写入器
    IndexWriter indexWriter = new IndexWriter(dir, conf);
    // 向索引库写入文档对象
    indexWriter.addDocument(doc);
    // 提交
    indexWriter.commit();
    // 关闭
    indexWriter.close();
}
@Test
public void createTest() throws Exception {
    //
    Document doc = new Document();
    doc.add(new LongField("id", 1, Store.YES));
    doc.add(new TextField("title", "谷歌地图之父跳槽FaceBook", Store.YES));
    doc.add(new TextField("context", "据国外媒体报道,曾先后负责谷歌地图和Wave开发工作的拉斯·拉斯姆森(Lars Rasmussen)已经离开谷歌,并将加盟Facebook。", Store.YES));
    indexCreate(doc);
}

查询索引

public static void indexSearcher(Query query, Integer n) throws IOException {
    // 初始化索引库对象
    Directory dir = FSDirectory.open(INDEX_FILE);
    // 索引读取工具
    IndexReader indexReader = DirectoryReader.open(dir);
    // 索引搜索对象
    IndexSearcher indexSeracher = new IndexSearcher(indexReader);
    // 执行搜索操作,返回值topDocs
    TopDocs topDocs = indexSeracher.search(query, n);
    // 匹配搜索条件的总记录数
    System.out.println("一共命中:" + topDocs.totalHits + "条数据");
    // 获得得分文档数组对象,得分文档对象包含得分和文档编号
    ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    for (ScoreDoc scoreDoc : scoreDocs) {
        int docID = scoreDoc.doc;
        float score = scoreDoc.score;
        System.out.println("文档编号:" + docID);
        System.out.println("文档得分:" + score);
        // 获取文档对象,通过索引读取工具
        Document document = indexReader.document(docID);
        System.out.println("id:" + document.get("id"));
        System.out.println("title:" + document.get("title"));
        System.out.println("context:" + document.get("context"));
    }
    indexReader.close();
}
@Test
public void searchTest() throws Exception {
    //单一字段的查询解析器
    // 创建查询解析器对象
    QueryParser parser = new QueryParser("title", new IKAnalyzer());
    // 创建查询对象
    Query query = parser.parse("谷歌");
    //根据Query搜索,返回评分最高的n条记录
    indexSearcher(query, 10);

    /*多字段的查询解析器
    MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[]{"id","title"}, new IKAnalyzer());
    Query query = parser.parse("1");*/
}

各种其他查询方式

//词条查询,查询条件必须是最小粒度不可再分割的内容
Query query = new TermQuery(new Term("title", "谷歌"));

//通配符查询, ?:匹配一个字符, *:匹配多个字符
Query query = new WildcardQuery(new Term("title", "*歌*"));

//模糊查询, 参数:1-词条,查询字段及关键词,关键词允许写错;2-允许写错的最大编辑距离,并且不能大于2(0~2)
Query query = new FuzzyQuery(new Term("title", "facebool"), 1);

//数值范围查询,查询非String类型的数据或者说是一些继承Numeric类的对象的查询,参数1-字段;2-最小值;3-最大值;4-是否包含最小值;5-是否包含最大值
Query query = NumericRangeQuery.newLongRange("id", 2l, 4l, true, true);

//组合查询, 交集: Occur.MUST + Occur.MUST, 并集:Occur.SHOULD + Occur.SHOULD, 非:Occur.MUST_NOT
BooleanQuery query = new BooleanQuery();
Query query1 = NumericRangeQuery.newLongRange("id", 2l, 4l, true, true);
Query query2 = new WildcardQuery(new Term("title", "*歌*"));
query.add(query1, Occur.SHOULD);
query.add(query2, Occur.SHOULD);

修改索引

//本质先删除再添加,先删除所有满足条件的文档,再创建文档, 因此,修改索引通常要根据唯一字段
public static void indexUpdate(Term term, Document doc) throws IOException {
    Directory dir = FSDirectory.open(INDEX_FILE);
    Analyzer analyzer = new IKAnalyzer();
    IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
    IndexWriter indexWriter = new IndexWriter(dir, conf);
    indexWriter.updateDocument(term, doc);
    indexWriter.commit();
    indexWriter.close();
    }
@Test
public void updateTest() throws Exception {
    Term term = new Term("title", "facebook");
    Document doc = new Document();
    doc.add(new LongField("id", 1L, Store.YES));
    doc.add(new TextField("title", "谷歌地图之父跳槽FaceBook", Store.YES));
    doc.add(new TextField("context", "河马程序员加盟FaceBook", Store.YES));
    indexUpdate(term, doc);
}

删除索引

// 执行删除操作(根据词条),要求id字段必须是字符串类型
public static void indexDelete(Term term) throws IOException {
    Directory dir = FSDirectory.open(INDEX_FILE);
    Analyzer analyzer = new IKAnalyzer();
    IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
    IndexWriter indexWriter = new IndexWriter(dir, conf);
    indexWriter.deleteDocuments(term);
    indexWriter.commit();
    indexWriter.close();
    }

public static void indexDeleteAll() throws IOException {
    Directory dir = FSDirectory.open(INDEX_FILE);
    Analyzer analyzer = new IKAnalyzer();
    IndexWriterConfig conf = new IndexWriterConfig(Version.LATEST, analyzer);
    IndexWriter indexWriter = new IndexWriter(dir, conf);
    indexWriter.deleteAll();
    indexWriter.commit();
    indexWriter.close();
    }
@Test
public void deleteTest() throws Exception {
    /*
     * Term term = new Term("context", "facebook"); indexDelete(term);
     */
    indexDeleteAll();
}

Lucene简单总结的更多相关文章

  1. Lucene 简单API使用

    本demo 简单模拟实现一个图书搜索功能. 模拟向数据库添加数据的时候,添加书籍索引. 提供搜索接口,支持按照书名,作者,内容进行搜索. 按默认规则排序返回搜索结果. Jar依赖: <prope ...

  2. Lucene 简单手记http://www.cnblogs.com/hoojo/archive/2012/09/05/2671678.html

    什么是全文检索与全文检索系统? 全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查 ...

  3. Lucene简单介绍

    [2016.6.11]以前写的笔记,拿出来放到博客里面~ 相关软件: Solr, IK Analyzer, Luke, Nutch;Tomcat; 1.是什么: Lucene是apache软件基金会j ...

  4. lucene简单搜索demo

    方法类 package com.wxf.Test; import com.wxf.pojo.Goods; import org.apache.lucene.analysis.standard.Stan ...

  5. lucene简单使用demo

    测试结构目录: 1.索引库.分词器 Configuration.java package com.test.www.web.lucene; import java.io.File; import or ...

  6. Lucene简单了解和使用

    一,Lucene简介 1 . Lucene  是什么? Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ...

  7. lucene简单使用

    lucene7以上最低要求jdk1.8 lucene下载地址: http://archive.apache.org/dist/lucene/java/ <dependency> <g ...

  8. lucene 简单搜索步骤

    1.创建IndexReader实例: Directory dir = FSDirectory.open(new File(indexDir)); IndexReader reader = Direct ...

  9. Lucene入门的基本知识(四)

    刚才在写创建索引和搜索类的时候发现非常多类的概念还不是非常清楚,这里我总结了一下. 1 lucene简单介绍  1.1 什么是lucene  Lucene是一个全文搜索框架,而不是应用产品.因此它并不 ...

随机推荐

  1. 通过一个例子,总结下检测数组属性的N种方法

    判断arr数组里是否含有a,有a返回1;没有返回2var arr = [{a:1,b:2,c:3},{q:1,w:2,e:3},{s:4,g:5,i:9},{b:2,v:3,u:4}]; 检测属性的3 ...

  2. 什么是css sprites,如何使用?

    css sprites:精灵图(雪碧图):把一堆小图片整合在一张大图上,通过背景图片相关设置(背景图片.背景图是否重复.背景图定位),显示图片,减轻服务器对图片的请求数量 优点: 1.减少网页的HTT ...

  3. Dynamics CRM 2011通过客户端代码选择视图

    在实施的过程中我们经常会遇到这样的场景,有个系统标准的Lookup字段对应的不是一种Entity,如很多地方的客户实际上可选account或者contact,有的地方可选systemuser或者tea ...

  4. java工程师要求

    高级JAVA研发工程师 8000-15000元/月 职位信息 职位描述 岗位要求:1.五年以上软件研发经验,两年以上软件架构设计经验:2.精通weblogic.jboss tomcat.websphe ...

  5. linux下使用iperf测试服务器带宽

    准备工具 1.2台Linux服务器(要求其中至少1台主机为腾讯云主机,另外一台任意主机均可,确保2台主机可以互相访问即可)2.Iperf软件为专业网络性能测试工具. 测试目标 上海地区主机外网带宽是否 ...

  6. VC++ MFC类库基础(55讲全)

    视频保存在播音员 网盘中内容简介: 本部分是您成为VC++软件工程师必备的阶段,如果您没有任何基础,学习C++能快速让您进入编程领域,建议配合书籍<C++入门经典> 关键词: VC++.V ...

  7. 使用python做最简单的爬虫

    使用python做最简单的爬虫 --之心 #第一种方法import urllib2 #将urllib2库引用进来response=urllib2.urlopen("http://www.ba ...

  8. linux上传、下载文件rz、sz命令

    1.介绍 sz命令是利用ZModem协议来从linux服务器传送文件到本地,一次可以传送一个或多个文件.相对应的从本地上传文件到Linux服务器,可以使用rz命令. 2.参数说明 -a,以文本方式传输 ...

  9. SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成

    今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...

  10. 自定义报告,用Java写一个html文件

    因为testng不满足我们的展示,所以我们会自己定义一个报告,实施步骤是,把静态页面做好后,放在Java项目中,其实和生成一个日志文件类似,只是该了后缀,Java中需要使用到PrintStream,案 ...