lucene4入门(2)搜索

欢迎转载http://www.cnblogs.com/shizhongtao/p/3440479.html

接着上一篇,这里继续搜索,对于搜索和创建一样,首先你要确定搜索位置,然后用规定的类来读取。还要注意一点,确定分词器,因为不同的分词器所创建的分词规则不同。上篇我使用的是默认的分词器,这里我也先不管分词器。为了方便阅读,代码就全部粘上。

  1 package com.bing.test;
  2 
  3 import java.io.File;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  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.document.FieldType;
 13 import org.apache.lucene.document.StringField;
 14 import org.apache.lucene.document.TextField;
 15 import org.apache.lucene.index.DirectoryReader;
 16 import org.apache.lucene.index.IndexReader;
 17 import org.apache.lucene.index.IndexWriter;
 18 import org.apache.lucene.index.IndexWriterConfig;
 19 import org.apache.lucene.queryparser.classic.ParseException;
 20 import org.apache.lucene.queryparser.classic.QueryParser;
 21 import org.apache.lucene.search.IndexSearcher;
 22 import org.apache.lucene.search.Query;
 23 import org.apache.lucene.search.ScoreDoc;
 24 import org.apache.lucene.search.TopDocs;
 25 import org.apache.lucene.store.Directory;
 26 import org.apache.lucene.store.FSDirectory;
 27 import org.apache.lucene.util.Version;
 28 
 29 /**
 30  * @author bingyulei
 31  * 
 32  */
 33 public class HelloLucene
 34 {
 35 
 36     Directory directory = null;
 37     Document doc;
 38     IndexWriter writer = null;
 39 
 40     /**
 41      * 
 42      * @param indexWriterPath
 43      *            索引创建路径
 44      * @param filePath
 45      *            读取文件路径
 46      */
 47     public void createIndex(String indexWriterPath, String filePath)
 48     {
 49 
 50         // 创建indexwriter
 51         Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_45);// 设置标准分词器
 52                                                                     // ,默认是一元分词
 53         IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_45,
 54                 analyzer);// 设置IndexWriterConfig
 55 
 56         try
 57         {
 58             // 创建directory
 59             // directory=RAMDirectory();//创建在内存中
 60             // 创建在硬盘上
 61             directory = FSDirectory.open(new File(indexWriterPath));// 打开存放索引的路径
 62             writer = new IndexWriter(directory, iwc);
 63 
 64             // 为document添加field
 65             addFile(writer, filePath);
 66 
 67             System.out.println("添加成功");
 68         } catch (IOException e)
 69         {
 70             // TODO Auto-generated catch block
 71             e.printStackTrace();
 72         }
 73 
 74     }
 75 
 76     private void addFile(IndexWriter writer, String filePath)
 77     {
 78         File f = new File(filePath);
 79         FieldType ft = new FieldType();
 80         ft.setIndexed(true);// 索引
 81         ft.setStored(true);// 存储,数据量比较大,一般都是不鼓励存储,放在索引文件中会把索引文件撑大
 82         ft.setTokenized(true);
 83         for (File file : f.listFiles())
 84         {
 85             try
 86             {
 87                 // 创建Document对象
 88                 doc = new Document();
 89                 // doc.add(new Field("content", new FileReader(file), ft));
 90                 doc.add(new TextField("content", new FileReader(file)));
 91                 doc.add(new TextField("filename", file.getName(), Store.YES));
 92                 doc.add(new StringField("path", file.getPath(), Store.YES));
 93                 // 添加文档
 94                 writer.addDocument(doc);
 95                 writer.commit();// 提交数据
 96             } catch (FileNotFoundException e)
 97             {
 98                 // TODO Auto-generated catch block
 99                 e.printStackTrace();
100             } catch (IOException e)
101             {
102                 // TODO Auto-generated catch block
103                 e.printStackTrace();
104             }
105 
106         }
107     }
108 
109     /**
110      * 搜索
111      * 
112      * @param path
113      *            搜索路径
114      * @param indexReaderPath
115      *            索引存放路径
116      */
117     public void seacher(String indexReaderPath, String searthText)
118     {
119         IndexReader reader=null;
120         try
121         {
122             directory = FSDirectory.open(new File(indexReaderPath));
123             // 创建读取索引的reader
124              reader = DirectoryReader.open(directory);
125             // 根据reader创建search
126             IndexSearcher searcher = new IndexSearcher(reader);
127             // 创建查询,第二个参数表示查询的字段名,第三个是分词器
128             QueryParser parser = new QueryParser(Version.LUCENE_45, "content",
129                     new StandardAnalyzer(Version.LUCENE_45));
130             // 搜索包含searthText的内容
131             Query query = parser.parse(searthText);
132             // 搜索返回10条记录
133             TopDocs tds = searcher.search(query, 10);
134             
135              //获取scoredoc对象组,
136              ScoreDoc[] sds=tds.scoreDocs;
137              for(ScoreDoc sd:sds){
138                  //获取具体的doc
139                  Document doc=searcher.doc(sd.doc);
140                  System.out.println(doc.get("filename")+":"+doc.get("path"));
141              }
142         } catch (IOException e)
143         {
144             // TODO Auto-generated catch block
145             e.printStackTrace();
146         }// 打开存放索引的路径
147         catch (ParseException e)
148         {
149             // TODO Auto-generated catch block
150             e.printStackTrace();
151         }finally{
152             if (reader!=null)
153             {
154                 try
155                 {
156                     reader.close();
157                 } catch (IOException e)
158                 {
159                     // TODO Auto-generated catch block
160                     e.printStackTrace();
161                 }
162             }
163         }
164     }
165 }
View Code

说明,"D:\\lucene\\file"是我复制lucene官方文档上的两段话,不过当你创建完索引之后,然后再修改文件内容,新加的内容并不能搜索出来。这个应该很好理解。

然后进行测试:searchTest,就可以得到那个文本文件中有"Changing Similarity"这段字符

package com.bing.test;import org.junit.Test;public class HelloLuceneTest
{@Testpublic void writertest(){HelloLucene test=new HelloLucene();test.createIndex("D:\\lucene\\index","D:\\lucene\\file");}@Testpublic void searchTest(){HelloLucene test=new HelloLucene();test.seacher("D:\\lucene\\index", "Changing Similarity");}
}

 

 

转载于:https://www.cnblogs.com/shizhongtao/p/3440479.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Topcoder SRM 648 (div.2)

第一次做TC全部通过&#xff0c;截图纪念一下。 终于蓝了一次&#xff0c;也是TC上第一次变成蓝名&#xff0c;下次就要做Div.1了&#xff0c;希望div1不要挂零。。。_(:зゝ∠)_ A. KitayutaMart2 万年不变的水题。 #include<cstdio> #include<cstring> #include&…

Kadane's algorithm学习

Kadane’s algorithm 简单来说就是用来计算数组中的连续子数组之和最大是多少 vector<int> vec; int temp 0,ans 0; for(int i0;i<vec.size();i){temp max(tempvec[i],vec[i]);ans max(temp,ans); } return ans;循环的第一行就是用来比较当前位置的值和前面数组…

好用的ajax后台框架

dwz 简单实用的国产jquery Ui框架 http://www.j-ui.com/#_blank转载于:https://www.cnblogs.com/userbibi/p/3441382.html

OpenFire源码学习之十九:在openfire中使用redis插件(上)

Redis插件 介绍 Redis是目前比较流行的NO-SQL&#xff0c;基于K,V的数据库系统。关于它的相关操作信息&#xff0c;本人这里就不做重复了&#xff0c;相关资料可以看这个网站http://www.redis.io/(官网)、http://www.redis.cn/(中文站)。 这里本人想说的是&#xff0c;拿Redis做…

c++ queue学习

参考资料&#xff1a; cppreference.com 本文代码&#xff1a; 本文源码 目录成员函数1.operator &#xff08;赋值给容器&#xff09;元素访问2.front &#xff08;访问第一个元素&#xff09;3.back &#xff08;访问最后一个元素&#xff09;容量4.empty &#xff08;判断容…

没有文件扩展“.js”的脚本引擎问题解决

安装MinGW的时候提示没有文件扩展“.js”的脚本引擎。原因&#xff1a;系统安装Dreamwear、UltraEdit、EditPlus后修改了.js文件的默认打开方式。当想直接执行js脚本时就会出现此错误。解决办法&#xff1a;打开注册表编辑器&#xff0c;定位[HKEY_CLASSES_ROOT.js]这一项&…

160 - 54 eKH

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、IDA 3、exeinfo 查壳发现是程序无壳且用Delphi语言编写 可以通过搜索字符串的方式定位关键函数地址 这里定位到是 00427B44ReadInput(a2, &v17); // 读取输入的usernameif ( StrL…

点赚接口(第二版)

1.查看是否有新消息 url&#xff1a;/get/message/status?user_id{user_id} method&#xff1a;get response&#xff1a; {"code": "ok","msg": "","data": 0 //新消息数目 } 2.获取消息列表 url&#xff1a;/get/messa…

Java基础之线程——使用Runnable接口(JumbleNames)

控制台程序。 除了定义Thread新的子类外&#xff0c;还可以在类中实现Runnable接口。您会发现这比从Thread类派生子类更方便&#xff0c;因为在实现Runnable接口时可以从不是Thread的类派生子类&#xff0c;并且仍然表示线程。Java只允许有单个基类&#xff0c;如果类派生于Thr…

cpri带宽不足的解决方法_白皮书:FPGA赋能下一代通信和网络解决方案(第四部分)...

对PCIe Gen 5的支持除了以太网和存储控制器&#xff0c;Speedster7t FPGA上提供的对PCIe Gen 5的支持还能够与主机处理器紧密集成&#xff0c;以支持诸如sidecar智能网卡(SmartNIC)设计等高性能加速器应用。PCI Gen 5控制器使其能够读取和写入存储在FPGA内存层级结构中的数据&a…

laravel里面使用event

模式&#xff1a;大概是通过一个自定义的event&#xff0c;一个handler&#xff0c;还有一个binder&#xff0c;然后用来简化通知模型 生成自定义的event ./artisan make:event MyEvent 生成自定义的handler ./artisan handler:event MyEventHandler --eventMyEvent 然后在Even…

C语言的条件编译#if, #elif, #else, #endif、#ifdef, #ifndef

有些程序在调试、兼容性、平台移植等情况下可能想要通过简单地设置一些参数就生成一个不同的软件&#xff0c;这当然可以通过变量设置&#xff0c;把所有可能用到的代码都写进去&#xff0c;在初始化时配置&#xff0c;但在不同的情况下可能只用到一部分代码&#xff0c;就没必…

山体等高线怎么看_每日一题 | 此处向斜山,你看出来了吗?

每日一题 | 此处向斜山&#xff0c;你看出来了吗&#xff1f;(2018江苏高考)如图为某区域地质简图。该区沉积地层有Q、P、C、D、S2、S1&#xff0c;其年代依次变老。读图回答1&#xff5e;2题。1&#xff0e;从甲地到乙地的地形地质剖面示意图是(  )2&#xff0e;为揭示深部地…

cmake The source directory xxxx does not appear to contain CMakeLists.txt

执行 cmake . 的时候报错&#xff1a; The source directory “xxxx” does not appear to contain CMakeLists.txt 简单来说就是当前文件夹里面没有 CMakeLists.txt

SSH出错--hibernate--org.hibernate.hql.ast.QuerySyntaxException: User is not mapped [from User]

String queryString "from user where u.userName ? and u.userPassword ?"; ----------------------------------------------------------- 改为&#xff1a; String queryString "from User where u.userName ? and u.userPassword ?"; 我估…

Linux下的tar压缩解压缩命令详解

tar -c: 建立压缩档案-x&#xff1a;解压-t&#xff1a;查看内容-r&#xff1a;向压缩归档文件末尾追加文件-u&#xff1a;更新原压缩包中的文件 这五个是独立的命令&#xff0c;压缩解压都要用到其中一个&#xff0c;可以和别的命令连用但只能用其中一个。下面的参数是根据需要…

java和c++的区别大吗_大空间消防水炮ZDMS0.8/30S坐装和吊装有区别吗?

大空间消防水炮现在是高大建筑的消防必备的设备之一&#xff0c;其型号按照流量可分为4种&#xff0c;ZDMS0.6/5S&#xff0c;ZDMS0.6/10S&#xff0c;SZDMS0.8/20S&#xff0c;ZDMS0.8/30S。在这中间使用较多的是5L和30L的&#xff0c;5L的消防水炮都是吊装&#xff0c;但是30…

Windows Hook(1)加载DLL

DLL代码 #include <Windows.h> BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:MessageBox(NULL, L"dllHook", L"Hook", MB_OK);break;case DLL_THR…

WPF Delegate委托整理

那啥&#xff0c;是从这里整理出来的&#xff0c;感谢Rising_Sun&#xff0c;整理的过于简单&#xff0c;看不明白的戳这里 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; us…

silverligh的数据访问

对于在Silverlight中访问数据&#xff0c;初学者的误解之一就是他们在Silverlight中寻找ADO.NET类库。别找了&#xff0c;找不到的。记住&#xff0c;Silverlight是部署在互联网上的客端技术&#xff0c;你不能要求一个浏览器插件去直接访问你的数据库……除非你想把数据库直接…