why
为什么是solr或者elasticsearch,而不是lucene?lucene只是一个组件,如果要在上面开发成本太大,solr和elasticsearch都是基于lucene的成熟的应用,可以快速上手。
solr是用来做全文检索的企业级应用。
安装
solr 官网下载地址, 这里笔者选用的版本是4.10.4
环境要求,需要jdk/openjdk 1.8或者1.7u55以上
sold整合tomcat , 这里笔者选用的tomcat版本为6.0.43
web.xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/usr/local/solr-4.10.4/example/solr</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
OK, 启动tomcat后,输入地址http://ip:port/solr/会出现solr的管理员页面
我们选用默认的core,这里core相当于一个数据集合
这里是一个overview的界面,左侧Analysis用来对词进行分析,Documents提供各种格式的数据导入,Query用来做查询,Files可以查看配置文件,schema brower可以查看schema.xml中字段,和字段类型的细节。
Documents
以json为例,我们导入一些Document,json api参考
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class RequestSender {
public static void main(String[] args) throws Exception {
add ();
}
public static void add() {
for (int i = 10; i < 15; i++) {
String url = "http://ip:port/solr/collection1/update?wt=json";
String data = "{\"add\":{ \"doc\":{\"id\":\"" + i + "\",\"title\":\"会吗abcd日本\",\"name\":\"是一个非常可爱的家伙\"},\"boost\":1.0,\"overwrite\":true,\"commitWithin\":1000}}";
doPost(url, data);
}
}
public static void delete() {
String url = "http://ip:port/solr/collection1/update?wt=json";
String data = "{\"delete\":{\"query\":\"*:*\"}";
doPost(url, data);
}
}
然后,我们在Query里面查询一下
IK中文分词和同义词配置
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>
schema.xml
<!--IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="false"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKAnalyzerSolrFactory" isMaxWordLength="true"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
配置了两个字段
<field name="name" type="text_ik" indexed="true" stored="true"/>
<field name="title" type="text_ik" indexed="true" stored="true" multiValued="true"/>
好了如果这样配置,重启tomcat后,页面会直接报异常,因为
IKAnalyzerSolrFactory是自定义实现的,
solr并不能同时支持ik中文分词和同义词,这里使用的jar包地址:
同义词配置
测试
OK,让我们测试一下中文分词,首先我们可以用Analysis测试一下
然后用Query查询一下结果
这里我们勾选了debugQuery,可以看到分词细节
可以看到,我们的中文分词,同义词有效果了
参考
solr 下载地址 http://archive.apache.org/dist/lucene/solr/
solr 安装要求 http://lucene.apache.org/solr/5_3_1/SYSTEM_REQUIREMENTS.html
solr整合 tomcat http://blog.csdn.net/seven_zhao/article/details/42743681
solr json 操作 http://wiki.apache.org/solr/UpdateJSON
solr 中文分词配置 http://blog.csdn.net/tjcyjd/article/details/43453007
solr ik和同义词整合 http://blog.csdn.net/tjcyjd/article/details/43699525
solr 性能测试 http://www.tuicool.com/articles/eQ3Qz2
solrj api http://lucene.apache.org/solr/4_2_1/solr-solrj/org/apache/solr/client/solrj/SolrQuery.html