索引库维护
上小节搞定了索引的基本创建和查询以及中文分词器的使用,本小结来看看如何增、删、改、查索引库。
创建document对象
使用如下代码添加索引
//添加索引 @Test public void addIndex() throws Exception { Directory directory = FSDirectory.open(new File("F:\\lucene-index").toPath()); IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(directory, config); Document document=new Document(); //不同的document可以有不同的域,同一个document可以有相同的域。 document.add(new TextField("filename", "新添加的文档", Field.Store.YES)); document.add(new TextField("content", "新添加的文档的内容", Field.Store.NO)); //LongPoint创建索引 document.add(new LongPoint("size", 100000000l)); //StoreField存储数据 document.add(new StoredField("size", 100000000l)); //不需要创建索引的就使用StoreField存储 document.add(new StoredField("path", "F:\\lucene-file\\新添加的文档.txt")); //添加文档到索引库 indexWriter.addDocument(document); //关闭indexwriter indexWriter.close(); }
添加完成后可以从luke里查看:
但是新添加三个字没有作为一个词出现,我们怎么才能查到呢?其实可以把新词添加到热词字典中:
代码中引入了词典配置后,在热词字典里添加上三个字新添加
这样再重建索引就能看到这三个词了
可以看到文档里也多了一条记录:
删除索引库
整库删除操作如下:
//删除索引 @Test public void deleteIndex() throws Exception { Directory directory = FSDirectory.open(new File("F:\\lucene-index").toPath()); IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(directory, config); //删除全部索引 indexWriter.deleteAll(); //关闭indexwriter indexWriter.close(); }
可以看到相关索引文件已经没有了,但是文件夹还在
索引已经看不到了
删除单条文档
使用如下代码删除所有标题包含tml的文件。
//删除指定查询条件索引 @Test public void deleteSearchIndex() throws Exception { Directory directory = FSDirectory.open(new File("F:\\lucene-index").toPath()); IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); IndexWriter indexWriter = new IndexWriter(directory, config); //创建一个查询条件 Query query = new TermQuery(new Term("filename", "tml")); //根据查询条件删除 indexWriter.deleteDocuments(query); //关闭indexwriter indexWriter.close(); }
再次查看,只能看到很丑.txt文档
更新单条文档数据
原理就是先删除后添加。
@Test public void updateIndex() throws Exception { IndexWriter indexWriter = getIndexWriter(); //创建一个Document对象 Document document = new Document(); //向document对象中添加域。 //不同的document可以有不同的域,同一个document可以有相同的域。 document.add(new TextField("filename", "要更新的文档", Field.Store.YES)); document.add(new TextField("content", " Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包," + "它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。", Field.Store.YES)); indexWriter.updateDocument(new Term("content", "java"), document); //关闭indexWriter indexWriter.close(); }
索引查询
索引查询有三种方式:term查询、数值范围查询以及queryparser查询,
Term Query查询
根据关键词进行查询,需要指定查询的域或关键词,我们以上用到的就是Term Query,在对应的域搜索中国人,能搜索到我是中国人。需要注意的是要查询的term必须是个关键词
RangeQuery查询
范围查询9000000到10000001中检测数值大小:
//数值范围查询 @Test public void rangeSearchIndex() throws Exception { //第一步:创建一个Directory对象,也就是索引库存放的位置。 Directory directory = FSDirectory.open(new File("F:\\lucene-index").toPath()); //第二步:创建一个indexReader对象,需要指定Directory对象。 IndexReader indexReader= DirectoryReader.open(directory); //第三步:创建一个indexsearcher对象,需要指定IndexReader对象 IndexSearcher indexSearcher=new IndexSearcher(indexReader); Query query = LongPoint.newRangeQuery("size", 9000000l, 10000001l); //执行查询 TopDocs topDocs = indexSearcher.search(query, 10); //共查询到的document个数 System.out.println("查询结果总数量:" + topDocs.totalHits); //遍历查询结果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("filename")); //System.out.println(document.get("content")); System.out.println(document.get("path")); System.out.println(document.get("size")); } //关闭indexreader indexSearcher.getIndexReader().close(); }
可以查到我们之前添加进去的文档
QueryParser 查询
当我们想通过一条语句去搜索所有相似记录的时候,通过关键词就不容易做到了,这个时候可以用QueryParser,当然要想使用需要引入相应的jar包:
然后我们在程序中输入一段话很帅真的是新添加么,term是查不出来的。需要带分析的查询,queryparse会先将语句分词然后搜索按得分排列
//queryparse范围查询 @Test public void querySearchIndex() throws Exception { //第一步:创建一个Directory对象,也就是索引库存放的位置。 Directory directory = FSDirectory.open(new File("F:\\lucene-index").toPath()); //第二步:创建一个indexReader对象,需要指定Directory对象。 IndexReader indexReader= DirectoryReader.open(directory); //第三步:创建一个indexsearcher对象,需要指定IndexReader对象 IndexSearcher indexSearcher=new IndexSearcher(indexReader); QueryParser queryParser = new QueryParser("filename", new IKAnalyzer()); Query query = queryParser.parse("很帅真的是新添加么"); //执行查询 TopDocs topDocs = indexSearcher.search(query, 10); //共查询到的document个数 System.out.println("查询结果总数量:" + topDocs.totalHits); //遍历查询结果 for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document document = indexSearcher.doc(scoreDoc.doc); System.out.println(document.get("filename")); //System.out.println(document.get("content")); System.out.println(document.get("path")); System.out.println(document.get("size")); } //关闭indexreader indexSearcher.getIndexReader().close(); }
这样,很帅和新添加相关文档都被搜索出来了
以上就是所有Lucene的基本概念和使用,下一篇blog正式进入ElasticSearch的入门和了解,其实大同小异,ElasticSearch就是对Lucene的封装而已