2017-4-30 14:34:26
为了测试在 Lucene 6 中已过时甚至已过时并移除的类、方法,以及测试很久不更新的 IK-Analyzer,建立 lucene4 模块,使用 Lucene 4.10.3、IK-Analyzer 2012FF_hf1。
mvn install:install-file -Dfile="IKAnalyzer2012FF_u1.jar" -DgroupId=org.wltea.ik-analyzer -DartifactId=ik-analyzer -Dversion=2012FF_u1 -Dpackaging=jar
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>2012FF_u1</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic;</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stopword.dic;</entry>
</properties>
//StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_3);
IKAnalyzer analyzer = new IKAnalyzer();
//文档大小
LongField sizeField = new LongField("fileSize", fileSize, Field.Store.YES);
//根据数字范围查询,[100,1000]
//构造函数(域名, 最小值, 最大值, 是否包含最小值, 是否包含最大值)
Query query = NumericRangeQuery.newLongRange("fileSize", 100L, 1000L, true, true);
该模块使用 lucene 6.5.1、Jcseg中文分词器 2.1.1。
将jcseg源码包中的lexicon文件夹和jcseg.properties文件复制到src/main/resources下,并修改jcseg.properties中的lexicon.path = src/main/resources/lexicon,在lexicon文件夹下新建文件lex-custom.lex用于添加自定义词元。
如何自定义使用词库: 从1.9.9版本开始,Jcseg已经默认将jcseg.properties和lexicon全部词库打包进了jcseg-core-{version}.jar中,如果是通过JcsegTaskConfig(true)构造的JcsegTaskConfig或者调用了JcsegTaskConfig#autoLoad()方法,在找不到自定义配置文件情况下Jcseg会自动的加载classpath中的配置文件,如果config.getLexiconPath() = null DictionaryFactory默认会自动加载classpath下的词库。
Jcseg的词性对照: 名词n、时间词t、处所词s、方位词f、数词m、量词q、区别词b、代词r、动词v、形容词a、状态词z、副词d、介词p、连词c、助词u、语气词y、叹词e、拟声词o、成语i、习惯用语l、简称j、前接成分h、后接成分k、语素g、非语素字x、标点符号w。并从语料库应用的角度,增加了专有名词(人名nr、地名ns、机构名称nt、其他专有名词nz)。
//部分代码
//参考:http://codepub.cn/2016/05/20/Lucene-6-0-in-action-2-All-kinds-of-Field-and-sort-operations/
//在Lucene 6.0中,IntField替换为IntPoint,FloatField替换为FloatPoint,LongField替换为LongPoint,DoubleField替换为DoublePoint。
//IntPoint:对int型字段索引,只索引不存储,提供了一些静态工厂方法用于创建一般的查询,提供了不同于文本的数值类型存储方式,使用KD-trees索引
LongPoint sizeField = new LongPoint("fileSize", fileSize);
//参考:http://stackoverflow.com/questions/42659616/lucene-6-adding-intfields
//如果需要存储,需创建独立的StoredField域,并在doc中添加
StoredField fileSize4Store = new StoredField("fileSize", fileSize);
//添加存储域
doc.add(fileSize4Store);
//创建分词器
//StandardAnalyzer analyzer = new StandardAnalyzer();
//lucene 4.x版本
//Analyzer analyzer = new JcsegAnalyzer4X(JcsegTaskConfig.COMPLEX_MODE);
//lucene 6.3.0以及以上版本
Analyzer analyzer = new JcsegAnalyzer(JcsegTaskConfig.COMPLEX_MODE);
//指定索引和文档的目录
FSDirectory directory = FSDirectory.open(Paths.get(searchIndexDirPath));
/**
* lucene 4 中,IndexReader.open(directory)过时,但未被移除
* lucene 5 中,IndexReader.open(directory)已被移除。
*/
//创建索引和文档的读取对象
IndexReader indexReader = DirectoryReader.open(directory);
//创建索引的搜索对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//部分代码
//LongPoint.newRangeQuery:根据数值范围进行搜索
//创建数值范围查询对象
Query query = LongPoint.newRangeQuery("fileSize", min, max);
//创建一个布尔查询对象
BooleanQuery booleanQuery = new BooleanQuery();
//创建查询条件
TermQuery query1 = new TermQuery(new Term("fileName", "传说"));
TermQuery query2 = new TermQuery(new Term("fileContext", "我们"));
//添加查询条件
booleanQuery.add(query1, BooleanClause.Occur.MUST);
booleanQuery.add(query2, BooleanClause.Occur.MUST);
//创建布尔查询对象的Builder对象
BooleanQuery.Builder builder = new BooleanQuery.Builder();
//创建查询条件
TermQuery query1 = new TermQuery(new Term("fileName", "传说"));
TermQuery query2 = new TermQuery(new Term("fileContext", "许毅"));
Query query3 = LongPoint.newRangeQuery("fileSize", 100L, 20000L);
//添加查询条件
builder.add(query1, BooleanClause.Occur.MUST);
builder.add(query2, BooleanClause.Occur.MUST);
builder.add(query3, BooleanClause.Occur.MUST);
//创建布尔查询对象
BooleanQuery booleanQuery = builder.build();
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。