分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Lucene

发布时间:2023-09-06 02:20责任编辑:顾先生关键词:暂无标签

核心示例代码:

 1 package xyz.zerone.lucene.pojo; 2 ?3 public class Book { 4 ????private Integer id; 5 ????private String name; 6 ????private Float price; 7 ????private String pic; 8 ????private String description; 9 ????public Integer getId() {10 ????????return id;11 ????}12 ????public void setId(Integer id) {13 ????????this.id = id;14 ????}15 ????public String getName() {16 ????????return name;17 ????}18 ????public void setName(String name) {19 ????????this.name = name;20 ????}21 ????public Float getPrice() {22 ????????return price;23 ????}24 ????public void setPrice(Float price) {25 ????????this.price = price;26 ????}27 ????public String getPic() {28 ????????return pic;29 ????}30 ????public void setPic(String pic) {31 ????????this.pic = pic;32 ????}33 ????public String getDescription() {34 ????????return description;35 ????}36 ????public void setDescription(String description) {37 ????????this.description = description;38 ????}39 ????@Override40 ????public String toString() {41 ????????return "Book [id=" + id + ", name=" + name + ", price=" + price + ", pic=" + pic + ", description="42 ????????????????+ description + "]";43 ????}44 ????45 }

 1 package xyz.zerone.lucene.dao; 2 ?3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.util.ArrayList; 7 import java.util.List; 8 import java.sql.PreparedStatement; 9 10 11 import xyz.zerone.lucene.pojo.Book;12 13 public class BookDaoImp implements BookDao {14 ????private static String sql = "select * from book";15 16 ????@Override17 ????public List<Book> findBookAll() throws Exception {18 ????????Connection connection = null;19 ????????PreparedStatement preparedStatement = null;20 ????????ResultSet resultSet = null;21 ????????List<Book> list = new ArrayList<Book>();22 ????????try {23 ????????????Class.forName("com.mysql.jdbc.Driver");24 ????????????connection = DriverManager.getConnection("jdbc:mysql://192.168.3.8:3306/lucenedb", "root", "123456");25 ????????????preparedStatement = connection.prepareStatement(sql);26 ????????????ResultSet rs = preparedStatement.executeQuery();27 ????????????while (rs.next()) {28 ????????????????Book book = new Book();29 ????????????????book.setId(rs.getInt("id"));30 ????????????????book.setName(rs.getString("name"));31 ????????????????book.setPrice(rs.getFloat("price"));32 ????????????????book.setPic(rs.getString("pic"));33 ????????????????book.setDescription(rs.getString("description"));34 ????????????????list.add(book);35 ????????????}36 ????????} catch (Exception e) {37 ????????????e.printStackTrace();38 ????????}39 ????????return list;40 ????}41 42 }

 ?1 package xyz.zerone.lucene.first; ?2 ??3 import java.io.File; ?4 import java.io.IOException; ?5 import java.util.ArrayList; ?6 import java.util.List; ?7 ??8 import org.apache.lucene.analysis.Analyzer; ?9 import org.apache.lucene.analysis.standard.StandardAnalyzer; 10 import org.apache.lucene.document.Document; 11 import org.apache.lucene.document.Field.Store; 12 import org.apache.lucene.index.IndexReader; 13 import org.apache.lucene.index.IndexWriter; 14 import org.apache.lucene.index.IndexWriterConfig; 15 import org.apache.lucene.queryparser.classic.ParseException; 16 import org.apache.lucene.queryparser.classic.QueryParser; 17 import org.apache.lucene.search.IndexSearcher; 18 import org.apache.lucene.search.Query; 19 import org.apache.lucene.search.ScoreDoc; 20 import org.apache.lucene.search.TopDocs; 21 import org.apache.lucene.document.FloatField; 22 import org.apache.lucene.document.StoredField; 23 import org.apache.lucene.document.StringField; 24 import org.apache.lucene.document.TextField; 25 import org.apache.lucene.store.Directory; 26 import org.apache.lucene.store.FSDirectory; 27 import org.apache.lucene.util.Version; 28 import org.apache.lucene.index.Term; 29 import org.junit.Test; 30 ?31 import xyz.zerone.lucene.dao.BookDaoImp; 32 import xyz.zerone.lucene.pojo.Book; 33 ?34 public class LuceneCore { 35 ????// 创建索引库生成到指定目录中 36 ????@Test 37 ????public void createIndexFromDb() throws Exception { 38 ????????// 定义List存储document 39 ????????List<Document> docs = new ArrayList<Document>(); 40 ????????// 从数据库获取book表的集合数据 41 ????????List<Book> bookList = new BookDaoImp().findBookAll(); 42 ????????for (Book book : bookList) { 43 ????????????// 创建Document 44 ????????????Document doc = new Document(); 45 ????????????// 创建Field域 46 ????????????// -创建book表字段id的field域 47 ????????????// --参数:域名、域中的value值、是否存储到文件系统 48 ????????????/** 49 ?????????????* 根据实际的需求: 这里的Field属性设置可以有三种(是否分词、是否索引、是否存储); 详见createAutoIndexDate(); 50 ?????????????*/ 51 ????????????TextField id = new TextField("id", book.getId().toString(), Store.YES); 52 ????????????TextField name = new TextField("name", book.getName(), Store.YES); 53 ????????????FloatField price = new FloatField("price", book.getPrice(), Store.YES); 54 ????????????TextField pic = new TextField("pic", book.getPic(), Store.YES); 55 ????????????TextField description = new TextField("description", book.getDescription(), Store.YES); 56 ????????????// 将field域加入到documet中 57 ????????????doc.add(id); 58 ????????????doc.add(name); 59 ????????????doc.add(price); 60 ????????????doc.add(pic); 61 ????????????doc.add(description); 62 ????????????// 将document加入集合 63 ????????????docs.add(doc); 64 ????????} 65 ????????// 创建一个标准的分词器 66 ????????Analyzer analyzer = new StandardAnalyzer(); 67 ????????// 创建索引目录的流对象,指定索引库存放位置 68 ????????Directory d = FSDirectory.open(new File("C:\\Users\\dangxiaopeng\\Desktop\\LuceneIndexData")); 69 ????????// IndexWriter配置对象 70 ????????// 参数:lucene版本、分词器 71 ????????IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer); 72 ????????// 创建索引操作对象,提供了很多方法操作索引文件(添加、修改、删除) 73 ????????IndexWriter indexWriter = new IndexWriter(d, conf); 74 ????????// 通过indexWriter创建索引 75 ????????for (Document doc : docs) { 76 ????????????indexWriter.addDocument(doc); 77 ????????} 78 ????????indexWriter.commit(); 79 ????????indexWriter.close(); 80 ????} 81 ?82 ????// 根据实际需求创建索引库生成到指定目录中 83 ????@Test 84 ????public void createAutoIndexFromDb() throws Exception { 85 ????????// 定义List存储document 86 ????????List<Document> docs = new ArrayList<Document>(); 87 ????????// 从数据库获取book表的集合数据 88 ????????List<Book> bookList = new BookDaoImp().findBookAll(); 89 ????????for (Book book : bookList) { 90 ????????????// 创建Document 91 ????????????Document doc = new Document(); 92 ????????????// 创建Field域 93 ????????????// -创建book表字段id的field域 94 ????????????// --参数:域名、域中的value值、是否存储到文件系统 95 ????????????// 图书id,不要分词,要索引,要存储 96 ????????????StringField id = new StringField("id", book.getId().toString(), Store.YES); 97 ????????????// 图书名称,要分词,要索引,要存储 98 ????????????TextField name = new TextField("name", book.getName(), Store.YES); 99 ????????????// 图书价格,要分词(Lucene需要的对价格数字特殊处理分词,以便处理范围查询),要索引,要存储100 ????????????FloatField price = new FloatField("price", book.getPrice(), Store.YES);101 ????????????// 图书图片,不要分词,不要索引,要存储102 ????????????StoredField pic = new StoredField("pic", book.getPic());103 ????????????// 图书描述,要分词,要索引,不要存储104 ????????????TextField description = new TextField("description", book.getDescription(), Store.YES);105 ????????????// 将field域加入到documet中106 ????????????doc.add(id);107 ????????????doc.add(name);108 ????????????doc.add(price);109 ????????????doc.add(pic);110 ????????????doc.add(description);111 ????????????// 将document加入集合112 ????????????docs.add(doc);113 ????????}114 ????????// 创建一个标准的分词器115 ????????Analyzer analyzer = new StandardAnalyzer();116 ????????// 创建索引目录的流对象,指定索引库存放位置117 ????????Directory d = FSDirectory.open(new File("C:\\Users\\dangxiaopeng\\Desktop\\LuceneIndexData"));118 ????????// IndexWriter配置对象119 ????????// 参数:lucene版本、分词器120 ????????IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);121 ????????// 创建索引操作对象,提供了很多方法操作索引文件(添加、修改、删除)122 ????????IndexWriter indexWriter = new IndexWriter(d, conf);123 ????????// 通过indexWriter创建索引124 ????????for (Document doc : docs) {125 ????????????indexWriter.addDocument(doc);126 ????????}127 ????????indexWriter.commit();128 ????????indexWriter.close();129 ????}130 131 ????// 删除索引132 ????@Test133 ????public void deleteIndex() throws IOException, ParseException {134 135 ????????// 调用indexWriter中删除索引方法136 137 ????????// 创建分词器138 ????????Analyzer analyzer = new StandardAnalyzer();139 140 ????????// 创建索引目录 的流对象,指定索引目录 的位置141 ????????Directory d = FSDirectory.open(new File("C:\\Users\\dangxiaopeng\\Desktop\\LuceneIndexData"));142 143 ????????// IndexWriter配置对象144 ????????// 参数:lucene的版本,分词器145 ????????IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);146 147 ????????// 创建indexWriter148 ????????IndexWriter indexWriter = new IndexWriter(d, conf);149 150 ????????// 删除全部索引151 ????????// indexWriter.deleteAll();152 153 ????????// 查询分析器154 ????????// 第一个参数:指定默认搜索的域,第二个:分词器155 ????????QueryParser queryParser = new QueryParser("description", analyzer);156 157 ????????// 创建查询对象158 ????????Query query = queryParser.parse("description:java");159 ????????// 删除符合条件的索引,删除符合query查询的所有document160 ????????indexWriter.deleteDocuments(query);161 ????????// 提交162 ????????indexWriter.commit();163 ????????// 关闭资源164 ????????indexWriter.close();165 166 ????}167 168 ????// 更新索引169 ????@Test170 ????public void updateIndex() throws IOException {171 ????????// 调用indexWriter中更新索引方法172 ????????// 创建分词器173 ????????Analyzer analyzer = new StandardAnalyzer();174 175 ????????// 创建索引目录 的流对象,指定索引目录 的位置176 ????????Directory d = FSDirectory.open(new File("C:\\Users\\dangxiaopeng\\Desktop\\LuceneIndexData"));177 178 ????????// IndexWriter配置对象179 ????????// 参数:lucene的版本,分词器180 ????????IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);181 182 ????????// 创建indexWriter183 ????????IndexWriter indexWriter = new IndexWriter(d, conf);184 185 ????????// 创建一个term作为查询条件186 ????????// 参数:field域名称,值187 ????????Term term = new Term("id", "1");188 189 ????????// 创建document,新的document,替换id等的1的document190 ????????Document doc = new Document();191 ????????// 图书id,不要分词,要索引、要存储192 ????????StringField id = new StringField("id", "1".toString(), Store.YES);193 194 ????????// 图书名称:要分词,要索引,要存储195 ????????TextField name = new TextField("name", "java编程思想第三版", Store.YES);196 197 ????????doc.add(id);198 ????????doc.add(name);199 200 ????????// 更新思路:根据term的信息查询document,找到之后删除document,添加doc中的添加到索引库201 ????????// 总之:先查询、再删除、再添加,建议根据主键field查询document。202 ????????indexWriter.updateDocument(term, doc);203 ????????// 提交204 ????????indexWriter.commit();205 ????????// 关闭资源206 ????????indexWriter.close();207 ????}208 209 ????// 搜索索引210 ????@Test211 ????public void searchIndex() throws ParseException, IOException {212 ????????// 分词,搜索过程使用的分词器要和创建索引时使用的分词器一致213 ????????Analyzer analyzer = new StandardAnalyzer();214 ????????// 查询分析器215 ????????// 参数:指定默认搜索field域、分词器216 ????????QueryParser queryParser = new QueryParser("description", analyzer);217 ????????// 创建查询对象(这里是使用了查询语法指定了description域如果不指定按照上面默认的field域)218 ????????Query query = queryParser.parse("description:java");219 ????????// 创建索引目录的流对象,指定索引目录位置220 ????????Directory d = FSDirectory.open(new File("C:\\Users\\dangxiaopeng\\Desktop\\LuceneIndexData"));221 ????????// 索引读取对象222 ????????// 指定读取索引的目录223 ????????IndexReader indexReader = IndexReader.open(d);224 ????????// 索引搜索对象225 ????????IndexSearcher indexSearcher = new IndexSearcher(indexReader);226 ????????// 执行搜索227 ????????// 参数:query查询对象、取出匹配度高的前n条记录228 ????????TopDocs topDocs = indexSearcher.search(query, 100);229 ????????// 取出匹配上的文档230 ????????ScoreDoc[] scoreDocs = topDocs.scoreDocs;231 ????????for (ScoreDoc scoreDoc : scoreDocs) {232 ????????????// document的id233 ????????????int docId = scoreDoc.doc;234 ????????????// 从indexReader根据docId获取document235 ????????????Document doc = indexReader.document(docId);236 ????????????// 取出doc中field域的内容237 ????????????// 参数指定field域名238 ????????????String id = doc.get("id");239 ????????????String name = doc.get("name");240 ????????????Float price = Float.parseFloat(doc.get("price"));241 ????????????String pic = doc.get("pic");242 243 ????????????System.out.println(id + "-" + name + "-" + price + "-" + pic);244 ????????}245 ????????// 关闭资源246 ????????indexReader.close();247 ????}248 }

Lucene深入(Luke&&中文分词器&&查询语句见相关文档)

Lucene

原文地址:https://www.cnblogs.com/laodang/p/9865595.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved