之前有一点研究,现在奉上比较完整的代码,可根据项目需要,自行扩展
package com.xiva.test.lucene; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.apache.lucene.analysis.cn.smart.Utility; public class ExtendWordDict { private short[] wordIndexTable; private char[] charIndexTable; private char[][][] wordItem_charArrayTable; private int[][] wordItem_frequencyTable; public static final int PRIME_INDEX_LENGTH = 12071; private void loadFromObjectInputStream(InputStream serialObjectInputStream) throws IOException, ClassNotFoundException { ObjectInputStream input = new ObjectInputStream(serialObjectInputStream); wordIndexTable = (short[]) input.readObject(); charIndexTable = (char[]) input.readObject(); wordItem_charArrayTable = (char[][][]) input.readObject(); wordItem_frequencyTable = (int[][]) input.readObject(); } private long hash1(char c) { final long p = 1099511628211L; long hash = 0xcbf29ce484222325L; hash = (hash ^ (c & 0x00FF)) * p; hash = (hash ^ (c >> 8)) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; return hash; } private int hash2(char c) { int hash = 5381; /* hash 33 + c */ hash = ((hash << 5) + hash) + c & 0x00FF; hash = ((hash << 5) + hash) + c >> 8; return hash; } private short getWordItemTableIndex(char c) { int hash1 = (int) (hash1(c) % PRIME_INDEX_LENGTH); int hash2 = hash2(c) % PRIME_INDEX_LENGTH; if (hash1 < 0) hash1 = PRIME_INDEX_LENGTH + hash1; if (hash2 < 0) hash2 = PRIME_INDEX_LENGTH + hash2; int index = hash1; int i = 1; while (charIndexTable[index] != 0 && charIndexTable[index] != c && i < PRIME_INDEX_LENGTH) { index = (hash1 + i * hash2) % PRIME_INDEX_LENGTH; i++; } if (i < PRIME_INDEX_LENGTH && charIndexTable[index] == c) { return (short) index; } else return -1; } private void sortEachItems() { char[] tmpArray; int tmpFreq; for (int i = 0; i < wordItem_charArrayTable.length; i++) { if (wordItem_charArrayTable[i] != null && wordItem_charArrayTable[i].length > 1) { for (int j = 0; j < wordItem_charArrayTable[i].length - 1; j++) { for (int j2 = j + 1; j2 < wordItem_charArrayTable[i].length; j2++) { if (Utility.compareArray(wordItem_charArrayTable[i][j], 0, wordItem_charArrayTable[i][j2], 0) > 0) { tmpArray = wordItem_charArrayTable[i][j]; tmpFreq = wordItem_frequencyTable[i][j]; wordItem_charArrayTable[i][j] = wordItem_charArrayTable[i][j2]; wordItem_frequencyTable[i][j] = wordItem_frequencyTable[i][j2]; wordItem_charArrayTable[i][j2] = tmpArray; wordItem_frequencyTable[i][j2] = tmpFreq; } } } } } } private void addExtendWords() { char[] extendChar = "李四".toCharArray(); short extendIdx = this.getWordItemTableIndex(extendChar[0]); char[][] items = wordItem_charArrayTable[wordIndexTable[extendIdx]]; if (items != null && items.length > 0) { System.out.println("start items" + items.length); char[][] extendItems = new char[items.length + 1][]; int[] extendfreqs = new int[items.length + 1]; extendfreqs[items.length] = 100; extendItems[items.length] = "四".toCharArray(); System.arraycopy(items, 0, extendItems, 0, items.length); wordItem_charArrayTable[wordIndexTable[extendIdx]] = extendItems; int[] freqs = wordItem_frequencyTable[wordIndexTable[extendIdx]]; wordItem_frequencyTable[wordIndexTable[extendIdx]] = extendfreqs; for (int freq : freqs) { System.out.println(freq); } this.sortEachItems(); System.out.println("End"); } } private void saveToObj(File serialObj) { try { ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream(serialObj)); output.writeObject(wordIndexTable); output.writeObject(charIndexTable); output.writeObject(wordItem_charArrayTable); output.writeObject(wordItem_frequencyTable); output.close(); // log.info("serialize core dict."); } catch (Exception e) { System.out.println(e.toString()); // log.warn(e.getMessage()); } System.out.println("save End"); } public void load() throws IOException, ClassNotFoundException { InputStream input = this.getClass().getResourceAsStream("coredict.mem"); loadFromObjectInputStream(input); } public static void main(String[] args) { File file = new File("coredict.mem"); ExtendWordDict wordDict = new ExtendWordDict(); try { // 加载字典 wordDict.load(); } catch (Exception e) { e.printStackTrace(); } //添加扩展词,可使用循环从文件读取需要扩展的词 wordDict.addExtendWords(); //将扩展词保存到文件 wordDict.saveToObj(file); } }
最后将新生成的coredict.mem文件,替换掉Jar包中的文件。
后续扩展:修改源码,添加一个扩展的txt文件。
除了扩展词,还有同义词需要研究。当然,禁止词SmartChineseAnalyzer已支持。
相关推荐
在给定的标题和描述中,我们看到IKAnalyzer已经更新以支持Lucene的高版本,包括5.x、6.x以及最新的7.3.1版本,这表明它持续跟进了Lucene的发展,确保与主流搜索引擎框架的兼容性。 1. **IKAnalyzer详解**: - IK...
本课程由浅入深的介绍了Lucene4的发展历史,开发环境搭建,分析lucene4的中文分词原理,深入讲了lucenne4的系统架构,分析lucene4索引实现原理及性能优化,了解关于lucene4的搜索算法优化及利用java结合lucene4实现...
Lucene.Net.Analysis.Cn.dll集成了诸如SmartChineseAnalyzer、SimpleChineseAnalyzer等分词器,它们能够根据词汇库和规则对中文文本进行有效的切分,从而为后续的索引和搜索提供基础。例如,SmartChineseAnalyzer是...
开发者可以通过NuGet包管理器轻松地将其引入项目,同时可以找到大量的教程、示例代码和第三方扩展,帮助开发者更好地理解和使用Lucene.Net。 总之,Lucene.Net.dll 2.9.2版本是.NET开发者构建全文搜索引擎的理想...
基于Lucene4.x实现Paoding分词器.rar
《Lucene 5.x与3.6.0版本差异详解》 Lucene作为一个强大的全文搜索引擎库,其每个版本的更新都带来了一系列的变化和优化。本文将深入探讨Lucene 5.x与Lucene 3.6.0之间的主要差异,帮助开发者理解新版本的功能改进...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页...共6页19.Lucene过滤 共4页20.Lucene分词器1 共3页21.Lucene分词器2 共9页22.Lucene分词器3 共4页23.Lucene项目实战1 共6页24.Lucene项目实战2 共6页25.Lucene...
《Lucene4.X实战:构建类百度搜索的大型文档海量搜索系统——排序篇》 在搜索引擎的世界里,正确的排序机制是提升用户体验的关键因素之一。Apache Lucene,作为一款强大的全文检索库,提供了丰富的功能,包括对搜索...
【Lucene4.x实战类百度搜索的大型文档海量搜索系统】是针对企业信息化系统中文档中心管理的一个实际应用,涉及到的技术主要包括文档处理、全文检索、高亮显示等关键环节。 首先,Lucene作为核心的搜索引擎库,负责...
《Lucene4.X实战:构建类百度搜索的大型文档海量搜索系统》 Lucene是一个强大的全文搜索引擎库,广泛应用于各种信息检索系统。本教程通过17讲内容,深入讲解了如何利用Lucene4.X实现一个类似百度的大型文档搜索系统...
《Lucene4.X实战:构建类似百度的大型文档搜索引擎》 在信息技术日新月异的今天,搜索引擎已经成为信息获取的重要工具。Apache Lucene作为一个高性能、全文检索库,为开发者提供了强大的搜索功能。本系列课程围绕...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
Lucene的核心组件之一是`org.apache.lucene.search.Filter`,它提供了一种方法来限制搜索结果,确保返回的数据符合特定条件。过滤器在搜索过程中起到了至关重要的作用,它们可以在不改变评分的情况下筛选出满足特定...
《Lucene4.X实战类baidu搜索的大型文档海量搜索系统》系列教程涵盖了从Lucene的基础概念到高级应用的全面讲解。在这个系列中,我们特别关注了Lucene的分词器,尤其是第三部分——"Lucene分词器3"。 Lucene作为一款...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...
【课程大纲】01.Lucene4入门精通实战课程-概述 共23页02.Lucene系统架构 共16页03.Lucene索引里有什么 共17页04.Lucene索引深入 共24页05.Lucene索引深入优化 共10页06.Lucene索引搜索 共13页07.Lucene搜索实战1 共4...