1.首先创建索引

package com.sunmap.analyzer;import java.io.File;
import java.io.IOException;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
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.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;/***    创建索引*/
public class MyIndexer {public static void createIndex(String indexPath) throws IOException {Directory directory = FSDirectory.open(new File(indexPath));Analyzer analyzer = new IKAnalyzer();IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46,analyzer);IndexWriter indexWriter = new IndexWriter(directory, config);Document document1 = new Document();document1.add(new TextField("title", "thinkpad超极本笔记本中的战斗机", Field.Store.YES));indexWriter.addDocument(document1);Document document2 = new Document();document2.add(new TextField("title", "用户可以在这里配置自己的扩展字典", Field.Store.YES));indexWriter.addDocument(document2);Document document3 = new Document();document3.add(new TextField("title", "您可以参考分词器源码", Field.Store.YES));indexWriter.addDocument(document3);Document document4 = new Document();document4.add(new TextField("title","第一台计算机是美国军方定制,专门为了计算弹道和射击特性表面而研制的,承担开发任务的“莫尔小组”由四位科学家和工程师埃克特、莫克利、戈尔斯坦、博克斯组成。1946年这台计算机主要元器件采用的是电子管。该机使用了1500"+ "个继电器,18800个电子管,占地170m2,重量重达30多吨,耗电150KW,造价48万美元。这台计算机每秒能完成5000次加法运算,400次乘法运算,比当时最快的计算工具快300倍,是继电器计算机的1000倍、手工计算的20万倍。"+ "用今天的标准看,它是那样的“笨拙”和“低级”,其功能远不如一只掌上可编程计算器,但它使科学家们从复杂的计算中解脱出来,它的诞生标志着人类进入了一个崭新的信息革命时代。",Field.Store.YES));indexWriter.addDocument(document4);indexWriter.close();}
}

2.创建一个检索类:

package com.sunmap.analyzer;import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;public class MySearcher {public static List<String> searchIndex(String keyword, String indexPath)throws IOException, ParseException {List<String> result = new ArrayList<>();IndexSearcher indexSearcher = null;IndexReader indexReader = DirectoryReader.open(FSDirectory.open(new File(indexPath)));indexSearcher = new IndexSearcher(indexReader);Analyzer analyzer = new IKAnalyzer();QueryParser queryParser = new QueryParser(Version.LUCENE_46, "title",analyzer);Query query = queryParser.parse(keyword);TopDocs td = indexSearcher.search(query, 10);for (int i = 0; i < td.totalHits; i++) {System.out.println(td.scoreDocs[i].score);Document document = indexSearcher.doc(td.scoreDocs[i].doc);result.add(document.get("title"));}return result;}
}

3.同义词检索:

package com.sunmap.analyzer;import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.synonym.SynonymFilterFactory;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.util.FilesystemResourceLoader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;
import org.wltea.analyzer.lucene.IKAnalyzer;public class AnalyzerUtil {/*** * 此方法描述的是:进行中文拆分*/public static String analyzeChinese(String input, boolean userSmart)throws IOException {StringBuffer sb = new StringBuffer();StringReader reader = new StringReader(input.trim());IKSegmenter ikSeg = new IKSegmenter(reader, userSmart);// true 用智能分词 ,false细粒度for (Lexeme lexeme = ikSeg.next(); lexeme != null; lexeme = ikSeg.next()) {sb.append(lexeme.getLexemeText()).append(" ");}return sb.toString();}/*** * 此方法描述的是:对传入的字符串进行同义词匹配,返回有同义词的TokenStream*/public static TokenStream convertSynonym(String input) throws IOException {Version ver = Version.LUCENE_46;Map<String, String> filterArgs = new HashMap<String, String>();filterArgs.put("luceneMatchVersion", ver.toString());//同义词词库位置filterArgs.put("synonyms", "config/synonyms.txt");filterArgs.put("expand", "true");SynonymFilterFactory factory = new SynonymFilterFactory(filterArgs);factory.inform(new FilesystemResourceLoader());Analyzer ikAnalyzer = new IKAnalyzer();TokenStream ts = factory.create(ikAnalyzer.tokenStream("someField", input));return ts;}/*** * 此方法描述的是:将tokenstream解析成字符串*/public static String displayTokens(TokenStream ts) throws IOException {StringBuffer sb = new StringBuffer();CharTermAttribute termAttr = ts.addAttribute(CharTermAttribute.class);ts.reset();while (ts.incrementToken()) {String token = termAttr.toString();sb.append(token);}ts.end();ts.close();return sb.toString();}public static void main(String[] args) {String indexPath = "/home/share/study/index_test";String input = "电脑";System.out.println("**********************");try {String result = displayTokens(convertSynonym(analyzeChinese(input,true)));/*** * 注意这块* 同义词检索就是把将要检索的词变成它的同义词和自己的合成词进行检索* * */System.out.println(result);
//            String result = input;
//            MyIndexer.createIndex(indexPath);List<String> docs = MySearcher.searchIndex(result, indexPath);for (String string : docs) {System.out.println(string);}} catch (IOException e) {e.printStackTrace();} catch (ParseException e) {e.printStackTrace();}}
}

输出结果:

**********************
加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
超极本计算机电脑
0.17161283
0.087962404
thinkpad超极本笔记本中的战斗机
第一台计算机是美国军方定制,专门为了计算弹道和射击特性表面而研制的,承担开发任务的“莫尔小组”由四位科学家和工程师埃克特、莫克利、戈尔斯坦、博克斯组成。1946年这台计算机主要元器件采用的是电子管。该机使用了1500个继电器,18800个电子管,占地170m2,重量重达30多吨,耗电150KW,造价48万美元。这台计算机每秒能完成5000次加法运算,400次乘法运算,比当时最快的计算工具快300倍,是继电器计算机的1000倍、手工计算的20万倍。用今天的标准看,它是那样的“笨拙”和“低级”,其功能远不如一只掌上可编程计算器,但它使科学家们从复杂的计算中解脱出来,它的诞生标志着人类进入了一个崭新的信息革命时代。

同义词词库synonyms.txt内容:

我,俺,hankcs
似,is,are => 是
好人,好心人,热心人
超极本,计算机,电脑

好人,好心人,热心人

代表同义词;

似,is,are => 是

似,is,are 可以转意为是;

转载于:https://www.cnblogs.com/freezone/p/5239207.html

初识lunece(同义词检索)相关推荐

  1. Lucene 应用 WordNet 的同义词典实现同义词检索(C#版)

    http://www.blogjava.net/Unmi/archive/2010/07/14/326123.html 同义词检索应该很多时候会用得上的,举个简单的例子,我们搜索关键字 good 的时 ...

  2. solr中文同义词检索的配置讲解

    1配置同义词首先是要基于中文分词的基础上进行的,如果检索关键词不能够进行中文分词那么是查询不到相关的同义词的(如果solr没有配置同义词,请参考附录进行配置,配置完成后进行后续操作) 2 如果是IKA ...

  3. 【搜索那些事】细谈lucene(一)初识全文资源检索框架lucene

    一:lucene历史和简介 Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.它不是一个完整的搜索应 ...

  4. 中国中药专利数据库及其检索系统

    http://218.240.13.195/tcm_patent/chineseversion/help/help.html  "中国中药专利数据库及其检索系统"(CTCMPD) ...

  5. Lunece全文检索搜索引擎

                   Lunece全文检索 1,什么是全文检索, lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完 ...

  6. 中国中药专利数据库检索系统(CTCMPD)

    http://www.sipo.gov.cn/sipo2008/xxcp/zysjk/200804/t20080407_370312.html "中国中药专利数据库及其检索系统"( ...

  7. ElasticSearch必知必会-基础篇

    商业发展与职能技术部-体验保障研发组 康睿 姚再毅 李振 刘斌 王北永 说明:以下全部均基于eslaticsearch 8.1 版本 一.索引的定义 官网文档地址:https://www.elasti ...

  8. 非结构化视频搜索技术

    非结构化视频搜索技术 2006-10-10 22:46 ■ 李蓬涛 编者按:视频搜索技术针对音视频这类非结构化数据,使用了语音识别.自动抽帧和内容自动关联等技术,真正做到了从内容上对视频进行搜索.20 ...

  9. 什么是用户体验地图?该如何绘制?

    什么是用户体验地图? 就像打仗需要地形图,体验提升的战斗也需要一个蓝图来规划和指引. 用户体验地图(Experience Maps)也被称为使用者旅程图(User Journey Map). 用直白的 ...

最新文章

  1. 天猫总架构师何崚:好的技术团队不是“需求翻译机”或“架构优化机”
  2. Transformer解析
  3. python制作自动回复脚本_python itchat实现微信自动回复的示例代码
  4. maya室内模型_C4d和3dmax、maya相比有什么优势?
  5. 操作系统--进程状态切换以及cpu调度(转)
  6. Ambari ambari 集群及组件
  7. GridView中使用CheckBox
  8. Qt学习之路(10): Meta-Object系统
  9. SQL 引擎如何把语句转换为一个抽象语法树?
  10. Win10 SAS9.4缺少增强型编辑器
  11. 51单片机LCD1602程序
  12. 旅游日记——2000元北京6天5夜游
  13. 山西大学量子计算机,关于量子力学与量子计算机
  14. 渗透测试(445端口)
  15. Java冻结Excel行或列
  16. diskpart clean 误操作恢复
  17. 清分--清算--结算
  18. 消息认证码和单向散列函数
  19. Visual Studio基本使用
  20. 景联文科技:关于语音标注,你知道多少?

热门文章

  1. 有服主传送玩家指令_我的世界:不用指令能够到达边境之地吗?实验证明,根本就不可能...
  2. 加入HA后的完全分布式集群搭建
  3. 华为m6升级鸿蒙,华为鸿蒙系统再传喜讯!14款华为旧旗舰喜提新系统:大幅度换血...
  4. R语言︱数据集分组、筛选(plit – apply – combine模式、dplyr、data.table)
  5. 如何实现百万TPS?详解JMQ4的存储设计
  6. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
  7. linux下无法执行PHP命令,错误 php: command not found
  8. Linux初级入门百篇-​LVM 简介
  9. 移动大数据时代:无线网络的挑战与机遇
  10. 将Excel数据导入mysql数据库的几种方法