本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. 向指定URL发送GET方法获取资源,编码问题。 Rest风格

    http编码.今天遇到获取网页上的数据,用HTTP的GET请求访问url获取资源,网上有相应的方法.以前一直不知道什么事rest风格,现在我想就是开一个Controller,然后使人可以调用你的后台代 ...

  2. 使用IIS发布WCF服务

    上一篇是Windows服务为宿主的WCF服务,现在用IIS为宿主发布WCF服务. 第一步:肯定是新建一个WCF服务啦[是WCF服务应用程序],然后在解决方案上再次添加一个新项目[我们选择WCF服务库, ...

  3. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  4. C++笔记(一)

    一.动态数组 一般我们定义数组都是用下面的方式: int str[100]; 但对于一些需要手动输入数组大小的情况,这种定义方式就行不通了.因为上面这种方式要求事先知道数组大小,并且给数组中括号中必须 ...

  5. Cassandra 键空间(keyspace),表(table)

    查看用户下信息: describe cluster; desc cluster;   查看所有keyspace: describe keyspaces; desc keyspaces;   查看key ...

  6. Magento-找出没有图片的产品

    最近维护网站,发现网站的产品很多都没有图片显示,看了一下是因为没有在后台勾选图片,就是 image small_image  thumbnail 这三项,就算有图片如果没有勾选的话也不会显示出来,产品 ...

  7. final发布视频

    final版本发布的视频已上传至秒拍,视频地址: http://m.miaopai.com/show/channel/AHqv~VA7lrk144ONLWrveQ__ 以下是功能截图:         ...

  8. WBS功能分解

    WBS功能分解表格如下: 功能 子功能 二级子功能 预计花费时间 (小时) 实际花费时间(小时) 地图显示跑道 制作地图 获得开发权限key 1 2 将sdk导入程序 0.5 1   调试程序 1 2 ...

  9. [整理]Centos6.5 + hadoop2.6.4环境搭建

    搭建Hadoop集群环境(3台机器) 1 准备环境 1.1 安装系统,并配置网络使3台机器互联互通,且SSH可直连(无需密码.保存私钥) 1.1.1 安装系统 安装Centos 6.5系统 安装过程略 ...

  10. 分布式入门之1:Lease机制

      引子: 分布式系统中,如何确认一个节点是否工作正常?   如果有3副本A.B.C,并通过中心结点M来管理.其中A为主副本. 未接触过分布式的直观的处理方法是在每个副本与中心节点M中维护一个心跳,期 ...