Solr下载
从官网下载地址中下载对应版本,目前笔者下载的版本为最新版7.3.1。
下载完成后,将压缩包解压,放至指定目录。
解压后,Solr目录结构如下:
部署至tomcat 8.0
1.将solr-7.3.1\server\solr-webapp下的webapp文件夹复制到/usr/local/solr/tomcat/webapps目录下,并重命名为solr(名称可以随意)
2. 复制solr-7.3.1\server\lib\ext下的所有jar包到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib下(即刚刚复制并重命名为solr的文件夹下)
3. 复制solr-7.3.1\server\lib下所有metrics-开头的jar包(一共有5个)到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib下
4. 复制solr-7.3.1\server\resources下的log4j.properties文件到/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes/下(默认没有classes文件夹,需要手动新建)
5. 复制solr-7.3.1\server\solr文件夹,到任意路径下(/usr/local/solr/solrhome/),并重命名为solr_home(命名随意)
6. 修改apache-tomcat-8.0.15\webapps\solr\WEB-INF下的web.xml文件。
默认代码为注释状态,释放后,将env-entry-value设置为solr_home的路径
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>E:/webserver/solr_home</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
注释以下代码,否则项目会报403错误
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method>TRACE</http-method>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Enable everything but TRACE</web-resource-name>
<url-pattern>/</url-pattern>
<http-method-omission>TRACE</http-method-omission>
</web-resource-collection>
</security-constraint>
7.在solr_home文件夹下创建一个mycore(名字随意)文件夹,并复制/root/solr-7.3.1/server/solr/configsets/_default/下的confi文件夹到mycore下。并在mycore下创建空文件夹data和core.properties文件。(创建二进制文件touch mytxt,创建文件vi censhi.txt,,创建文件夹mkdir mycore)
core.properties文件内容如下:
name=mycore
最后mycore文件夹结构如下:
8.运行apache-tomcat-8.0.15\bin下的startup.bat,启动tomcat。
9.访问http://localhost:8080/solr/index.html#/,部署完成
ik-analyzer-solr7
ik-analyzer for solr7.x
IKAnalyzer的作者为林良益(linliangyi2007@gmail.com),项目网站为http://code.google.com/p/ik-analyzer/
适配最新版solr7,并添加动态加载字典表功能;
在不需要重启solr服务的情况下加载新增的字典。
使用说明:
<!-- Maven仓库地址 -->
<dependency>
<groupId>com.github.magese</groupId>
<artifactId>ik-analyzer-solr7</artifactId>
<version>7.x</version>
</dependency>
-
1. 将jar包放入solr服务的jetty或tomcat的webapp/WEB-INF/lib/目录下(/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib);
-
2. 将resources目录下的5个配置文件放入solr服务的jetty或tomcat的webapp/WEB-INF/classes/目录下(/usr/local/solr/tomcat/webapps/solr/WEB-INF/classes);
①IKAnalyzer.cfg.xml ②ext.dic ③stopword.dic ④ik.conf ⑤dynamicdic.txt
-
3. 配置solr的managed-schema,添加ik分词器,示例如下;
<!-- ik分词器 --> <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
-
1.1.1.1 业务字段配置
业务字段判断标准:
1、在搜索时是否需要在此字段上进行搜索。例如:商品名称、商品的卖点、商品的描述
2、后续的业务是否需要用到此字段。例如:商品id。
需要用到的字段:
1、商品id
2、商品title
3、卖点
4、价格
5、商品图片
6、商品分类名称
7、商品描述
Solr中的业务字段:
1、id——》商品id
其他的对应字段创建solr的字段。
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
(solr7.4.0配置)
<
field
name
=
"item_title"
type
=
"text_ik"
indexed
=
"true"
stored
=
"true"
/>
<
field
name
=
"item_sell_point"
type
=
"text_ik"
indexed
=
"true"
stored
=
"true"
/>
<
field
name
=
"item_price"
type
=
"plong"
indexed
=
"true"
stored
=
"true"
/>
<
field
name
=
"item_image"
type
=
"string"
indexed
=
"false"
stored
=
"true"
/>
<
field
name
=
"item_category_name"
type
=
"string"
indexed
=
"true"
stored
=
"true"
/>
<
field
name
=
"item_desc"
type
=
"text_ik"
indexed
=
"true"
stored
=
"false"
/>
<
field
name
=
"item_keywords"
type
=
"text_ik"
indexed
=
"true"
stored
=
"false"
multiValued
=
"true"
/>
<
copyField
source
=
"item_title"
dest
=
"item_keywords"
/>
<
copyField
source
=
"item_sell_point"
dest
=
"item_keywords"
/>
<
copyField
source
=
"item_category_name"
dest
=
"item_keywords"
/>
<
copyField
source
=
"item_desc"
dest
=
"item_keywords"
/>
重新启动tomcat
1.2 维护索引库
添加:添加一个json格式的文件就可以。
修改:在solr中没有update,只需要添加一个新的文档,要求文档id和被修改文档的id一致。原理是先删除后添加。
删除:使用xml格式。
删除两种方法:
1、根据id删除:
<delete>
<id>test001</id>
</delete>
<commit/>
2、根据查询删除:
<delete>
<query>*:*</query>
</delete>
<commit/>
1 solrJ客户端
需要依赖solrj的jar包。
<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
1.1 使用solrj的使用
1.2 把商品信息导入到索引库public class SolrTest { //添加 @Test public void addDocument() throws SolrServerException, IOException { //创建连接 SolrServer solrServer =new HttpSolrServer("http://192.168.253.130:8080/solr/mycore"); //创建一个空文档 SolrInputDocument document =new SolrInputDocument(); document.addField("id", "test001"); document.addField("item_title", "测试商品3"); document.addField("item_price", 54321); //把文档对象写进索引库 solrServer.add(document); //提交 solrServer.commit(); } //删除 @Test public void deleteDocument() throws SolrServerException, IOException { //创建连接 SolrServer solrServer =new HttpSolrServer("http://192.168.253.130:8080/solr/mycore"); // solrServer.deleteById("test001"); solrServer.deleteByQuery("*:*"); solrServer.commit(); } //查询 @Test public void queryDocument() throws SolrServerException { //创建连接 SolrServer solrServer =new HttpSolrServer("http://192.168.253.130:8080/solr/mycore"); //创建查询对象 SolrQuery query =new SolrQuery(); //设置查询条件 query.setQuery("*:*"); // query.setStart(20); // query.setRows(50); //执行查询条件 QueryResponse response = solrServer.query(query); //去查询结果 SolrDocumentList solrDocumentList = response.getResults(); System.out.println("共查询记录:" + solrDocumentList.getNumFound()); for (SolrDocument solrDocument : solrDocumentList) { System.out.println(solrDocument.get("id")); System.out.println(solrDocument.get("item_title")); System.out.println(solrDocument.get("item_price")); System.out.println(solrDocument.get("item_image")); } } }
使用java程序读取mysql数据库中的商品信息,然后创建solr文档对象,把商品信息写入索引库。
需要发布一个服务。
为了灵活的进行分布式部署需要创建一搜素的服务工程发布 搜素服务。Taotao-search。
-
4. 启动solr服务测试分词;
-
5. ik.conf文件说明:
files=dynamicdic.txt lastupdate=0
files为动态字典列表,可以设置多个字典表,用逗号进行分隔,默认动态字典表为dynamicdic.txt;
lastupdate默认值为0,每次对动态字典表修改后请+1,不然不会将字典表中新的词语添加到内存中,lastupdate采用的是int类型,不支持时间戳,如果使用时间戳的朋友可以把源码中的int改成long即可;
-
5-dynamicdic.txt 为动态字典,在此文件配置的词语不需重启服务即可加载进内存中;