本demo 简单模拟实现一个图书搜索功能。

  • 模拟向数据库添加数据的时候,添加书籍索引。
  • 提供搜索接口,支持按照书名,作者,内容进行搜索。
  • 按默认规则排序返回搜索结果。

Jar依赖:

    <properties>
<lucene.version>4.6.1</lucene.version>
</properties> <!-- lucence jar -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lucene.version}</version>
</dependency>

  

核心类:

/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.demo; import com.demo.convertor.BookConvertor;
import com.demo.domain.BookDO; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; import java.io.File;
import java.io.IOException;
import java.util.*; /**
* lucence 简单demo
*
* @author baoxing.gbx
* @version $Id:LucenceDemo.java, V 0.1 2015-11-11 14:15 baoxing.gbx Exp $$
*/
public class LucenceDemo { /** 索引库存目录 */
private Directory directory; /** 分词器 */
private Analyzer analyzer; /** 索引写 */
private IndexWriter indexWriter; /** 索引查询 */
private IndexWriterConfig indexWriterConfig; /** 索引查询 */
private IndexSearcher searcher; /** 模拟数据库 */
private static Map<String, Object> dataBase = new HashMap<String, Object>(); /**
* 初始化操作
*
* @throws IOException
*/
public void init() throws IOException { // 1. 获取lucence索引目录
Properties properties = new Properties();
properties
.load(LucenceDemo.class.getClassLoader().getResourceAsStream("lucence.properties"));
directory = FSDirectory.open(new File((String) properties.get("path")));
// 2. 构造分词器
analyzer = new StandardAnalyzer(Version.LUCENE_40); // 3. 构造索引输入
indexWriterConfig = new IndexWriterConfig(Version.LUCENE_40, analyzer);
indexWriterConfig.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
indexWriter = new IndexWriter(directory, indexWriterConfig); } /**
* 模拟数据库添加,同时添加索引
*
* @param bookDO
* @throws IOException
*/
public void addDoc(BookDO bookDO) throws IOException { // 数据库操作
dataBase.put(bookDO.getId() + "", bookDO);
// 索引操作
Document document = BookConvertor.convert2Doc(bookDO);
indexWriter.addDocument(document);
} /**
* 搜索
*
* @param keyword
* @return
* @throws Exception
*/
public List<BookDO> search(String keyword) throws Exception {
// 构造查询
IndexReader indexReader = IndexReader.open(directory);
searcher = new IndexSearcher(indexReader); // 支持书名, 作者, 内容搜索
String[] fields = { "name", "author", "content" };
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_40, fields, analyzer);
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
Query query = queryParser.parse(keyword); // 最多给5个
TopDocs topdocs = searcher.search(query, 5);
ScoreDoc[] scoreDocs = topdocs.scoreDocs; System.out.println("查询结果总数---" + topdocs.totalHits + "最大的评分--" + topdocs.getMaxScore()); List<BookDO> result = new ArrayList<BookDO>();
for (int i = 0; i < scoreDocs.length; i++) {
int doc = scoreDocs[i].doc;
Document document = searcher.doc(doc); System.out.println("docId--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score
+ "---index--" + scoreDocs[i].shardIndex); result.add((BookDO) dataBase.get(document.get("id")));
}
return result;
} /**
* Getter method for property <tt>analyzer</tt>.
*
* @return property value of analyzer
*/ public Analyzer getAnalyzer() {
return analyzer;
} /**
* Setter method for property <tt>analyzer</tt>.
*
* @param analyzer value to be assigned to property analyzer
*/
public void setAnalyzer(Analyzer analyzer) {
this.analyzer = analyzer;
} /**
* Getter method for property <tt>dataBase</tt>.
*
* @return property value of dataBase
*/ public Map<String, Object> getDataBase() {
return dataBase;
} /**
* Setter method for property <tt>dataBase</tt>.
*
* @param dataBase value to be assigned to property dataBase
*/
public void setDataBase(Map<String, Object> dataBase) {
this.dataBase = dataBase;
} /**
* Getter method for property <tt>directory</tt>.
*
* @return property value of directory
*/ public Directory getDirectory() {
return directory;
} /**
* Setter method for property <tt>directory</tt>.
*
* @param directory value to be assigned to property directory
*/
public void setDirectory(Directory directory) {
this.directory = directory;
} /**
* Getter method for property <tt>indexWriter</tt>.
*
* @return property value of indexWriter
*/ public IndexWriter getIndexWriter() {
return indexWriter;
} /**
* Setter method for property <tt>indexWriter</tt>.
*
* @param indexWriter value to be assigned to property indexWriter
*/
public void setIndexWriter(IndexWriter indexWriter) {
this.indexWriter = indexWriter;
} /**
* Getter method for property <tt>indexWriterConfig</tt>.
*
* @return property value of indexWriterConfig
*/ public IndexWriterConfig getIndexWriterConfig() {
return indexWriterConfig;
} /**
* Setter method for property <tt>indexWriterConfig</tt>.
*
* @param indexWriterConfig value to be assigned to property indexWriterConfig
*/
public void setIndexWriterConfig(IndexWriterConfig indexWriterConfig) {
this.indexWriterConfig = indexWriterConfig;
} /**
* Getter method for property <tt>searcher</tt>.
*
* @return property value of searcher
*/ public IndexSearcher getSearcher() {
return searcher;
} /**
* Setter method for property <tt>searcher</tt>.
*
* @param searcher value to be assigned to property searcher
*/
public void setSearcher(IndexSearcher searcher) {
this.searcher = searcher;
} }

  

测试类:

/**
* Alipay.com Inc.
* Copyright (c) 2004-2015 All Rights Reserved/
*/
package com.demo; import com.demo.domain.BookDO; import org.junit.Test; import junit.framework.TestCase; import java.util.List; /**
*
* @author baoxing.gbx
* @version $Id:LucenceDemoTest.java, V 0.1 2015-11-11 15:21 baoxing.gbx Exp $$
*/
public class LucenceDemoTest extends TestCase { LucenceDemo lucenceDemo = null; @Override
protected void setUp() throws Exception { // 数据准备
lucenceDemo = new LucenceDemo(); lucenceDemo.init(); // 循环添加100本书
for (int i = 1; i <= 2; ++i) { BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("zhangsan" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("Java是一种可以撰写跨平台应用程序的面向对象的程序设计开发语言");
lucenceDemo.addDoc(bookDO);
} for (int i = 3; i <= 4; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("lisi" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网");
lucenceDemo.addDoc(bookDO);
} for (int i = 5; i <= 6; ++i) {
BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("wangwu" + i);
bookDO.setName("Java program" + i);
bookDO.setContent("同时拥有全球最大的开发者专业社");
lucenceDemo.addDoc(bookDO);
} for (int i = 7; i <= 8; ++i) { BookDO bookDO = new BookDO();
bookDO.setId(i);
bookDO.setAuthor("xiaoming" + i);
bookDO.setName("C++ program" + i);
bookDO.setContent("C++是在C语言的基础上开发的一种面向对象编程语言");
lucenceDemo.addDoc(bookDO);
}
} /**
* 测试根据书名查找
*/
@Test
public void testNameSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("Java"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试根据作者查找
*/
@Test
public void testAuthorSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("zhangsan1"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试根据内同查找
*/
@Test
public void testContentSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("开发"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
} /**
* 测试多条件查找
*/
@Test
public void testMutiSearch() { try { lucenceDemo.getIndexWriter().close(); List<BookDO> bookDOs = lucenceDemo.search("zhangsan1 C++"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} bookDOs = lucenceDemo.search("zhangsan1 Java"); System.out.println("查询到" + bookDOs.size() + "本相关书籍。 详细信息如下:");
for (int i = 0; i < bookDOs.size(); ++i) {
System.out.println(bookDOs.get(i).toString());
} } catch (Exception e) {
assertTrue(e.getMessage(), false);
}
}
}

 

代码地址 :https://github.com/EstarG/lucenceDemo

Lucene 简单API使用的更多相关文章

  1. HDFS基本命令行操作及上传文件的简单API

    一.HDFS基本命令行操作: 1.HDFS集群修改SecondaryNameNode位置到hd09-2 (1)修改hdfs-site.xml <configuration> //配置元数据 ...

  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简单总结

    Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...

  5. 安装比特币区块链钱包API(Blockchain Wallet用户发送和接收比特币的简单API)

    区块链钱包API提供了一个简单的界面,商家可以用它以编程方式与钱包进行交互. 安装:要使用此API,您需要运行负责管理区块链钱包的小型本地服务. 您的应用程序通过HTTP API调用在本地与此服务进行 ...

  6. lucene简单使用

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

  7. 在CentOS7部署zookeeper集群以及简单API使用

    一.部署zookeeper集群 zookeeper是一个针对大型分布式系统的协调系统,提供的功能有统一名称服务.分布式同步等. 1.上传zk安装包 2.解压     tar -xzvf zookeep ...

  8. lucene简单搜索demo

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

  9. 简单API练手:(1)复制自身程序到windows目录和系统目录下;(2)获得系统的相关信息。

    1.复制自身程序到windows目录和系统目录下: #include <windows.h> #include <stdio.h> #include <string.h& ...

随机推荐

  1. centos6.4 挂载新盘并移动mysql数据目录

    1 centos 挂载新盘并格式化 以vmware workstation12 中安装的centos6. 虚拟机为例进行演示 关机,添加硬盘 开机,格式化硬盘,并挂载 通过命令查看硬盘 fdisk – ...

  2. OpenCV 轮廓基本特征

     http://blog.csdn.net/tiemaxiaosu/article/details/51360499 OpenCV 轮廓基本特征 2016-05-10 10:26 556人阅读 评论( ...

  3. CAS学习笔记(二)—— cas server端的login-webflow详细流程

    一.配置文件介绍 关于spring的配置信息只需放入WEB-INF/spring-configuration目录即可,cas启动时会自动加载.这个目录下的spring配置文件几乎不需要改动. 在web ...

  4. [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. python 中使用celery

    http://www.thinksaas.cn/group/topic/395734/

  6. regeneratorRuntime未定义

    babel-preset-stage-2 { "presets": ["es2015", "stage-2"], "plugins ...

  7. php + jQuery自动完成插件autocompleter

    autocompleter是一个简单的,容易的,可定制的自动完成功能插件,支持缓存. 1.引用脚本 <script type="text/javascript" src=&q ...

  8. 浅析Java.lang.Process类

    一.概述      Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序).      Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...

  9. Hibernate5.1.0的hello word

    新建一个JavaProject(不一定非要web工程) 在工程里面新建一个文件夹lib,用来存放jar包 找到Hibernate的下载文件,解压后找到required文件夹,这是需要的jar包 添加到 ...

  10. 如何用Java代码列出一个目录下所有的文件?

    目录文件夹 File file=new File("H:\\"); for(File temp:file.listFiles()){//Java5的新特性之一就是增强的for循环. ...