2 Star 1 Fork 0

小柯 / lucene_and_solr_demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

学习 lucene 和 solr

2017-4-30 14:34:26

一、参考文档

  1. Lucene 6.4.0 core API
  2. Lucene 6 adding IntFields | Stack Overflow
  3. Jcseg是基于mmseg算法的一个轻量级中文分词器……
  4. ik-analyzer java开源中文分词器
  5. Maven项目中Lucene集成中文分词工具Jcseg和Ansj
  6. Lucene 6.0 实战(2)-各种Field及排序操作
  7. Windows下搭建Solr5.5搜索服务
  8. Solr6.0与Jetty、Tomcat在Win环境下搭建/部署
  9. Solr 6.1 + Tomcat 单机部署
  10. Why No War | Solr Wiki
  11. Installing Solr | Apache Solr Reference Guide & Running Solr | Apache Solr Reference Guide

二、lucene4

为了测试在 Lucene 6 中已过时甚至已过时并移除的类、方法,以及测试很久不更新的 IK-Analyzer,建立 lucene4 模块,使用 Lucene 4.10.3、IK-Analyzer 2012FF_hf1。

1. 手动安装 IK-Analyzer 2012FF_hf1 到本地Maven仓库
mvn install:install-file -Dfile="IKAnalyzer2012FF_u1.jar" -DgroupId=org.wltea.ik-analyzer -DartifactId=ik-analyzer -Dversion=2012FF_u1 -Dpackaging=jar
2. 在pom.xml中添加引用
<dependency>
    <groupId>org.wltea.ik-analyzer</groupId>
    <artifactId>ik-analyzer</artifactId>
    <version>2012FF_u1</version>
</dependency>
3. Ik-Analyzer配置文件
  • 复制 IKAnalyzer.cfg.xml 和 stopword.dic 到resources目录下;
  • 在resources目录下创建 ext.dic,用于添加自定义词元,修改 IKAnalyzer.cfg.xml 如下:
<?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>
4. 更改java代码:将StandardAnalyzer换成IKAnalyzer即可。
//StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_3);
IKAnalyzer analyzer = new IKAnalyzer();
5. LongField 和 NumericRangeQuery ——这两个类在 Lucene 6 中均已过时,不在推荐使用
//文档大小
LongField sizeField = new LongField("fileSize", fileSize, Field.Store.YES);
//根据数字范围查询,[100,1000]
//构造函数(域名, 最小值, 最大值, 是否包含最小值, 是否包含最大值)
Query query = NumericRangeQuery.newLongRange("fileSize", 100L, 1000L, true, true);

三、lucene

该模块使用 lucene 6.5.1、Jcseg中文分词器 2.1.1。

1. Jcseg添加自定义词元

将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)。

2. 创建索引
//部分代码

//参考: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);
3. 查询方法
    1. QueryParser:根据域名进行搜索,可以设置默认搜索域(只能在文本内容中搜索)。
    1. TermQuery:根据词进行搜索(只能在文本内容中搜索)。
    1. LegacyNumericRangeQuery:根据数值范围进行搜索,该类已过时!
    1. LongPoint.newRangeQuery:根据数值范围进行搜索,只有在索引创建时,使用LongPoint存储fileSize属性,才能使用该方法搜索。
    1. BooleanQuery:组合查询。
    1. MatchAllDocsQuery:查询索引目录下所有的文档。
    1. MultiFieldQueryParser:指定多个搜索域。
4. 根据数值范围进行查询
//部分代码

//LongPoint.newRangeQuery:根据数值范围进行搜索
//创建数值范围查询对象
Query query = LongPoint.newRangeQuery("fileSize", min, max);
5. 组合条件查询
lucene 4
//创建一个布尔查询对象
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);
lucene 6
//创建布尔查询对象的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();

四、solr

空文件

简介

学习 lucene 和 solr 展开 收起
Java
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/kerraway/lucene_and_solr_demo.git
git@gitee.com:kerraway/lucene_and_solr_demo.git
kerraway
lucene_and_solr_demo
lucene_and_solr_demo
master

搜索帮助