lucene的建立索引,搜索,中文分词
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的建立索引,搜索,中文分词相关推荐
- 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示4
前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开发的时候,有中文的话肯定要使用中文分词了,这一篇博文主要介绍一下如何使用 ...
- 【Lucene】Apache Lucene全文检索引擎架构之中文分词和高亮显示
欢迎关注我新搭建的博客:http://www.itcodai.com/ 前面总结的都是使用Lucene的标准分词器,这是针对英文的,但是中文的话就不顶用了,因为中文的语汇与英文是不同的,所以一般我们开 ...
- 与Lucene 4.10配合的中文分词比较
比较目的 衡量每种分词的指标,内存消耗.CPU消耗,得到一个在Lucene中比较好的分词版本. 分词源代码介绍 paoding: 庖丁解牛最新版在 https://code.google.com/p/ ...
- 与Lucene 4.10配合的中文分词比较(转)
比较目的 衡量每种分词的指标,内存消耗.CPU消耗,得到一个在Lucene中比较好的分词版本. 分词源代码介绍 paoding: 庖丁解牛最新版在 https://code.google.com/p/ ...
- php es中文分词,Elasticsearch搜索中文分词优化
Elasticsearch 中文搜索时遇到几个问题: 当搜索关键词如:"人民币"时,如果分词将"人民币"分成"人","民" ...
- pylucene构建索引_java-Apache Lucene:建立索引时如何使用TokenSt...
我正在寻找一种使用Apache Lucene编写自定义索引的方法(准确地说是PyLucene,但Java回答很好). 我要执行的操作如下:将文档添加到索引时,Lucene会将其标记化,删除停用词等.如 ...
- 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较...
本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...
- 基于php的Sphinx以及coreseek的全文搜索,中文分词的使用(一)
基于php的Sphinx以及coreseek的全文搜索,中文分词的使用(一) ##1.sphinx简介 1.什么是sphinx Sphinx是由俄罗斯人Andrew Aksyonoff开发的一个全文检 ...
- Lucene快速入门第三讲——看看Lucene是如何支持中文分词的?
在这一讲中,我们要看看Lucene到底是如何支持中文分词的?为了向大家阐述明白这个问题,咱们可先从分析器的执行过程入手. 分析器(Analyzer)的执行过程 如下图所示是语汇单元的生成过程: 从一个 ...
最新文章
- Oracle 原理 : 动态性能视图和数据字典
- 初学scrum及首次团队开发
- 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)
- spring boot配置dubbo(properties)
- Python获取指定文件夹下的文件名
- 【揭示网页挂马技术的秘密(转网络安全)】
- 利用 MATLAB 和 DCRAW 处理数码相机 RAW 文件的完整流程
- knn(k近邻算法)——python
- [转]U盘启动制作工具|大白菜启动制作工具
- 按下 Home 键后发生了什么事?
- 后端返回一个下载Excel表格的url,要PC浏览器打开下载,前端代码设计
- linux系统中ssh命令,Linux系统中SSH 命令的用法有哪些?
- 面试-Iteration Owner-新加坡航空
- Linux概述及软件安装与使用
- base64加密原理详解
- 网络舆情分析-part1
- 设计模式 ----- 设计模式总结
- 【Python-Microfilm-web-app-flask】基于Flask构建的微电影网站实例及源码参考
- 一个处于发展过程中的企业,该如何进行精准获客?且不话大价钱。
- 如何才能够有效长高?避免走弯路