Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包。
现在最新的lucene已经更新到6.0版本了。但是这个最新版,需要适配jdk1.80以上的版本。
所以我这里用的5.5.1的版本的,它对jdk没有这么高的要求,比较适应开发。下面分三步简单的将lucene的建立索引,搜索,中文分词,介绍给大家。
用到的包:

一,建立索引:
1,定义三个字符串数组,分别对应:id,content,city。
2,写个getWriter(),在里面建立分析器analyzer。
3,通过IndexWriter将目录,将分析器绑定在一起。
4,将字符串数组,写入到文档,再通过有分析器流写出。
通过以上步骤,lucene就会帮我将索引建立好了。
代码:

import java.nio.file.FileSystems;
import java.nio.file.Path;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
public class IndexFile {  protected String[] ids={"1", "2"};  protected String[] content={"Amsterdam has lost of add  cancals", "i love  add this girl"};  protected String[] city={"Amsterdam", "Venice"};  private Directory dir;  /** * 初始添加文档 * @throws Exception */  @Test  public void init() throws Exception {  String filePath = "F:/1/index";Path path = FileSystems.getDefault().getPath(filePath);//得到系统文件的路径dir = FSDirectory.open(path);//通过系统打开目录IndexWriter writer=getWriter();  //得到写出流for(int i=0; i < ids.length; i++) {  Document doc=new Document();  //将内容写入文本中doc.add(new StringField("id", ids[i], Store.YES));  doc.add(new TextField("content", content[i], Store.YES));  doc.add(new StringField("city", city[i], Store.YES));  writer.addDocument(doc);  //将文本写出}  System.out.println("init ok?");  writer.close();  }  /** * 获得IndexWriter对象 * @return * @throws Exception */  public IndexWriter getWriter() throws Exception {  Analyzer analyzer=new StandardAnalyzer();  IndexWriterConfig iwc=new IndexWriterConfig( analyzer);  //加入分析器,建立索引return new IndexWriter(dir, iwc);  }  }

产生的结果:

二,搜索:
通过上面已经将文件建好了索引,现在我们要做的就是通过这个索引,去搜索对应的内容。
1,找对应的文件夹,打开文件将文件读入
2,将文件加入到搜索器中,指定对应的索引,这里是content中的单词add作为搜索条件。注意设置最大输出结果,search(query, 10)就是这个方法中的数字。
代码:

import java.nio.file.FileSystems;
import java.nio.file.Path;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
public class IndexSearch {/*** 查询* * @throws Exception*/@Testpublic void testSearch() throws Exception {String filePath = "F:/1/index";Path path = FileSystems.getDefault().getPath(filePath);Directory dir = FSDirectory.open(path);IndexReader reader = DirectoryReader.open(dir);  //注意这里用的是读入IndexSearcher searcher = new IndexSearcher(reader);//将目标文件加入搜索器Term term = new Term("content", "add");//content==》key   add===>valueTermQuery query = new TermQuery(term);TopDocs topdocs = searcher.search(query, 10);//这个数字输出的最多记录数ScoreDoc[] scoreDocs = topdocs.scoreDocs;System.out.println("查询结果总数---" + topdocs.totalHits + "---最大的评分--" + topdocs.getMaxScore());for (int i = 0; i < scoreDocs.length; i++) {int doc = scoreDocs[i].doc;Document document = searcher.doc(doc);System.out.println("content====" + document.get("content"));System.out.println("id--" + scoreDocs[i].doc + "---scors--" + scoreDocs[i].score + "---index--"+ scoreDocs[i].shardIndex);}reader.close();}
}

结果展示:

三,中文分词:
lucene自带分词,考虑到中英文分词,这里我们选用的是lucene-analyzers-smartcn-5.5.1.jar包,它能较好的支持中英文分词。
1,定义一段话,含中英文。
2,写入自定义,停用词,所谓停用词,就是lucene在分词时,会自动过滤这些词,不会对其进行分割,直接将其忽略。
3,将这些自定义停用词加入到系统。
4,将文本加入分词器,就会将词分好了。
代码:

import java.util.Iterator;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.util.Version;
public class SmartChineseAnalyzerTest {  public static void main(String[] args) {  try {  // 要处理的文本  String text = "lucene分析器使用分词器和过滤器构成一个“管道”,文本在流经这个管道后成为可以进入索引的最小单位,因此,一个标准的分析器有两个部分组成,一个是分词器tokenizer,它用于将文本按照规则切分为一个个可以进入索引的最小单位。另外一个是TokenFilter,它主要作用是对切出来的词进行进一步的处理(如去掉敏感词、英文大小写转换、单复数处理)等。lucene中的Tokenstram方法首先创建一个tokenizer对象处理Reader对象中的流式文本,然后利用TokenFilter对输出流进行过滤处理";  // 自定义停用词  String[] self_stop_words = { "的", "了", "呢", ",", "0", ":", ",", "是", "流" };  CharArraySet cas = new CharArraySet( 0, true);  for (int i = 0; i < self_stop_words.length; i++) {  cas.add(self_stop_words[i]);  }  // 加入系统默认停用词  Iterator<Object> itor = SmartChineseAnalyzer.getDefaultStopSet().iterator();  while (itor.hasNext()) {  cas.add(itor.next());  }  // 中英文混合分词器(其他几个分词器对中文的分析都不行)  SmartChineseAnalyzer sca = new SmartChineseAnalyzer( cas);  TokenStream ts = sca.tokenStream("field", text);  CharTermAttribute ch = ts.addAttribute(CharTermAttribute.class);  ts.reset();  while (ts.incrementToken()) {  System.out.println(ch.toString());  }  ts.end();  ts.close();  } catch (Exception ex) {  ex.printStackTrace();  }  }
}

部分结果展示:

lucene的建立索引,搜索,中文分词相关推荐

  1. 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示4

    前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用 ...

  2. 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示

    欢迎关注我新搭建的博客:http://www.itcodai.com/ 前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开 ...

  3. 与Lucene 4.10配合的中文分词比较

    比较目的 衡量每种分词的指标,内存消耗.CPU消耗,得到一个在Lucene中比较好的分词版本. 分词源代码介绍 paoding: 庖丁解牛最新版在 https://code.google.com/p/ ...

  4. 与Lucene 4.10配合的中文分词比较(转)

    比较目的 衡量每种分词的指标,内存消耗.CPU消耗,得到一个在Lucene中比较好的分词版本. 分词源代码介绍 paoding: 庖丁解牛最新版在 https://code.google.com/p/ ...

  5. php es中文分词,Elasticsearch搜索中文分词优化

    Elasticsearch 中文搜索时遇到几个问题: 当搜索关键词如:"人民币"时,如果分词将"人民币"分成"人","民" ...

  6. pylucene构建索引_java-Apache Lucene:建立索引时如何使用TokenSt...

    我正在寻找一种使用Apache Lucene编写自定义索引的方法(准确地说是PyLucene,但Java回答很好). 我要执行的操作如下:将文档添加到索引时,Lucene会将其标记化,删除停用词等.如 ...

  7. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较...

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  8. 基于php的Sphinx以及coreseek的全文搜索,中文分词的使用(一)

    基于php的Sphinx以及coreseek的全文搜索,中文分词的使用(一) ##1.sphinx简介 1.什么是sphinx Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检 ...

  9. Lucene快速入门第三讲——看看Lucene是如何支持中文分词的?

    在这一讲中,我们要看看Lucene到底是如何支持中文分词的?为了向大家阐述明白这个问题,咱们可先从分析器的执行过程入手. 分析器(Analyzer)的执行过程 如下图所示是语汇单元的生成过程: 从一个 ...

最新文章

  1. Oracle 原理 : 动态性能视图和数据字典
  2. 初学scrum及首次团队开发
  3. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)
  4. spring boot配置dubbo(properties)
  5. Python获取指定文件夹下的文件名
  6. 【揭示网页挂马技术的秘密(转网络安全)】
  7. 利用 MATLAB 和 DCRAW 处理数码相机 RAW 文件的完整流程
  8. knn(k近邻算法)——python
  9. [转]U盘启动制作工具|大白菜启动制作工具
  10. 按下 Home 键后发生了什么事?
  11. 后端返回一个下载Excel表格的url,要PC浏览器打开下载,前端代码设计
  12. linux系统中ssh命令,Linux系统中SSH 命令的用法有哪些?
  13. 面试-Iteration Owner-新加坡航空
  14. Linux概述及软件安装与使用
  15. base64加密原理详解
  16. 网络舆情分析-part1
  17. 设计模式 ----- 设计模式总结
  18. 【Python-Microfilm-web-app-flask】基于Flask构建的微电影网站实例及源码参考
  19. 一个处于发展过程中的企业,该如何进行精准获客?且不话大价钱。
  20. 如何才能够有效长高?避免走弯路

热门文章

  1. 融资租赁业务系统LPR调息引擎
  2. Oracle生成随机数字、字符串、日期、验证码及 UUID的方法
  3. Scala偏函数与部分函数
  4. android如何获得歌曲的路径,android通过MP3路径获取MP3的album
  5. matlab求单边功率谱
  6. 【VB】MSHFlexGrid表格数据导出到Excel
  7. Python实现关联规则推荐
  8. HQ-SAM:高质量地分割一切东西
  9. (qqqqc)自用模板
  10. js调用打印接口打印web页面之——使用lodop组件打印jsp web页面