欢迎光临我的个人网站,CSDN更多以工具文章为主,个人网站里会有更多关于编程思维等多方面的文章网购
..从产品设计css一直做到linux运维的程序猿... 很多技术都是皮毛,各位见谅,只求和大家交流一点小技术,欢迎拍砖!..
TIP: 看了一些回复,首先谢谢大家支持,知道大家一定也希望学习4.7,也不是不想更新,确实时间有限,同时我在项目中负责很多事情,也很杂,不是专门弄搜索引擎开发的,所以即使学到的也不能保证全面。如果大家有什么问题,或者具体哪方面的想法可以提一下,我更多是在开发中遇到需要处理的问题,然后总结才会发布新博客,也不可能完全花时间像写教材一样做哈
Lucene作为全文所以的不二工具,最新已经到4.7.0,在大学时候玩过一段时间,那时候版本很早,现在4.7.0和原来的语法差距很大了,也没有专门针对最新版本的书籍,包括国外的博客文章都很少,我神州大地就难觅踪影了(如果哪位找到了欢迎拍砖,我想看中文教学..官方英文文档还是有点头晕的)所以最近开发也算是锻炼吧,顺便提供一点学习经验给大家
0.准备工作:
1). Lucene官方API http://lucene.apache.org/core/4_7_0/index.html
2). Lucene 4.7.0 下载 http://www.apache.org/dyn/closer.cgi/lucene/java/4.7.0
3). 所用到的jar包
- lucene-analyzers-common-4.7.0.jar
- lucene-analyzers-smartcn-4.7.0.jar
- lucene-core-4.7.0.jar
- lucene-queryparser-4.7.0.jar
本次先介绍关于创建索引
1. 总步骤
这些都算是基础了,如果这些都不太明白的请参考其他博客先学习基础~
- //a.从数据源准备索引数据
- List<KeyVO> keywords = getKeyWords();
- //b.创建IndexWriter
- indexWriter = getIndexWriter();
- //c.根据索引数据创建索引
- addDoc(indexWriter, keywords);
a. 从数据源准备索引数据
这个就不用多说了,多条数据,每个数据有自己的key-value,作为索引值
b. 创建IndexWriter
这里变化比较大,很多之前参考的语法都无法使用,或者被废弃,或者不推荐了,这里参考了官方的
DEMO
- private IndexWriter getIndexWriter() throws IOException {
- Directory dir = FSDirectory.open(new File(indexBuild));
- //Version操作开始变得非常常见
- //中文分词器的引入,好像4.7.0对庖丁等第三方分词器兼容得并不好,可能也是因为apache对原生的做了一些整合的缘故
- Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_47);
- //同时引入了IndexWriterConfig对象,封装了早期版本的一大堆参数
- IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_47, analyzer);
- IndexWriter writer = new IndexWriter(dir, config);
- return writer;
- }
c. 根据索引数据创建索引
4.7.0 对Field做了更进一步的封装,官方DEMO推荐已经不再是原来的new Field然后传参了,(虽然语法还存在,但是有些已经被废弃了)具体可以参考
org.apache.lucene.document包下的相关Field的类
举例,如StringField:
http://lucene.apache.org/core/4_7_0/core/org/apache/lucene/document/StringField.html
A field that is indexed butnot tokenized: the entire String value is indexed as a single token. For example this might be used for a'country'field or an'id' field, or any field that you intend to use for sorting or access through the field cache.
这段英文应该不难吧,StringField就是可以被参与索引的(is indexed),但是并不做分词操作(not tokenized),适合做id或者国家名这种“要么不对,要么整个都对”
然后我下面还用到了StoredField(只存不索引),TextField(索引并分词)
- private void addDoc(IndexWriter indexWriter, List<ResultVOFromDB> resultList) throws IOException {
- for (ResultVOFromDB vo : resultList) {
- Document doc = createDoc(vo);
- indexWriter.addDocument(doc);
- }
- }
- private Document createDoc(ResultVOFromDB vo) throws UnsupportedEncodingException {
- Document doc = new Document();
- //就像有某个商品,查询结果列表要展示商品的名称,ID,和跳转链接地址,所以从数据库取出name,id,url字段
- doc.add(new StringField("name", vo.name, Field.Store.YES));
- doc.add(new StringField("id", vo.id, Field.Store.YES));
- doc.add(new StoredField("url", vo.url));
- //这个keywords就像博客文章的自定义“关键字”,这些字有多个,而且都会做用到索引并且接受分词操作的,“css学习”会被拆分为“css”和“学习”
- String[] keys = vo.keywords;
- for (int i = 0; i < keys.length; i++) {
- doc.add(new TextField("keyword", keys[i],Field.Store.YES));
- }
- return doc;
- }
下次继续奉上Lucene4.7.0 索引查找方面的操作