Lucene

Posted laodang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucene相关的知识,希望对你有一定的参考价值。

核心示例代码:

 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     @Override
40     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     @Override
17     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     @Test
133     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         // 创建indexWriter
148         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查询的所有document
160         indexWriter.deleteDocuments(query);
161         // 提交
162         indexWriter.commit();
163         // 关闭资源
164         indexWriter.close();
165 
166     }
167 
168     // 更新索引
169     @Test
170     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         // 创建indexWriter
183         IndexWriter indexWriter = new IndexWriter(d, conf);
184 
185         // 创建一个term作为查询条件
186         // 参数:field域名称,值
187         Term term = new Term("id", "1");
188 
189         // 创建document,新的document,替换id等的1的document
190         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     @Test
211     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的id
233             int docId = scoreDoc.doc;
234             // 从indexReader根据docId获取document
235             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的主要内容,如果未能解决你的问题,请参考以下文章

lucene demo代码

三搜索引擎篇-lucene入门代码示例

ElasticSearch 学习笔记一 简介

Lucene学习总结

Lucene分析

1. 初识 Lucene