Solr以前的版本须要依托于Tomcat做为载体才能进行使用,不过如今Solr已经支持独立运行,解压后运行指令即可启用。安装以前须要注意,Solr 8版本所须要的JDK须要8.0或以上。html
[root@localhost]# wget http://mirror.bit.edu.cn/apache/lucene/solr/8.0.0/solr-8.0.0.tgz
[root@localhost]# tar -zxvf solr-8.0.0.tgz
复制代码
bin/solr
(*nix下),bin/solr.cmd
(Windows下)。这也是Apache最为推荐的去启动或中止Solr的运行工具。server/solr-webapp
)server/lib
)server/logs
)以及日志配置文件(server/resources
)server/solr/configsets
)进入bin目录下经过脚本启动Solr:java
[root@localhost]# cd solr-8.0.0/bin
[root@localhost]# ./solr start
复制代码
当一上来启动时,系统会以下报错,表示您的最大打开文件数、最大进程数应该上调到65000。若是root用户启动还会警告存在风险,须要添加-force才可启动。mysql
*** [WARN] *** Your open file limit is currently 1024.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
*** [WARN] *** Your Max Processes Limit is currently 7183.
It should be set to 65000 to avoid operational disruption.
If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
WARNING: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
Please consult the Reference Guide. To override this check, start with argument '-force'
复制代码
咱们能够经过修改打开文件、进程限制值解决限制的问题,也能够经过修改solr.in.sh关闭SOLR_ULIMIT_CHECKS检查,强制启动。web
[root@localhost]# vim solr.in.sh
复制代码
[root@localhost]# ./solr start -p 8983 -force # -p 指定端口默认8983 -force(root用户必选)
NOTE: Please install lsof as this script needs it to determine if Solr is listening on port 80.
Started Solr server on port 80 (pid=19359). Happy searching!
[root@localhost]#
复制代码
访问一下,看到仪表盘即为大功告成:spring
在管理页面建立core以前,须要在server
下的solr
目录下创建一个和将要建立core同名的文件夹。并在该文件夹下建立conf
(配置文件夹),将配置文件放入其中。在server/solr/configsets/
目录下有能够直接拽过来用的配置模板,本文直接把_default
下的conf
文件夹拽过来使用。sql
[root@localhost]# cd solr-8.0.0/server/solr
[root@localhost]# mkdir test # 为将要建立core的名称
[root@localhost]# cp -rf configsets/_default/conf test/
复制代码
而后咱们去Solr管理界面建立core: shell
在操做Core以前,须要在建立的core的conf
下的managed-schema
文件中添加须要用到的字段。关于Documents、Fields、Schema的设计可在官方文档中查看。除了几个默认字段,本文所用到的:数据库
<field name="company" type="string" multiValued="false" indexed="true" stored="true"/>
<field name="person" type="string" multiValued="false" indexed="true" stored="true"/>
复制代码
添加完了去刷新一下core apache
Schema
选项,出现相应字段即为添加成功:
在旁边一列的Documents
下进行添加操做: vim
旁边的Query
界面中可进行查询。q下面的一行表示查询的参数,左 * 是字段名,右 * 是查询条件, *表明任意值,下图为查询全部记录:
Solr中的全部字段中存在一个惟一索引字段,可在managed-schema
中的 <uniqueKey></uniqueKey>
中定义,默认id
字段为惟一索引。修改时只须要再次添加惟一索引字段索引的内容便可完成更新替换。
在添加界面内(Documents
)的Document Type
中选择XML方式,可根据id和根据查询进行删除。
<delete>
<id>1</id>
</delete>
<commit/>
复制代码
<delete>
<query>person:马化腾</query>
</delete>
<commit/>
复制代码
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
复制代码
spring:
data:
solr:
host: http://192.168.78.132:8983/solr/test #http://你的地址/solr/你建立的core的名称
复制代码
package com.yurui.solrjdemo.entity;
import org.apache.solr.client.solrj.beans.Field;
public class Info {
@Field //将要添加到Solr中的字段的注解
private String id;
@Field
private String person;
@Field
private String company;
//setters,getters,toString省略
}
复制代码
package com.yurui.solrjdemo;
import com.yurui.solrjdemo.entity.Info;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrInputDocument;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SolrjdemoApplicationTests {
@Autowired
private SolrClient solrClient;
@Test
public void test() throws IOException, SolrServerException {
// 普通字段添加
SolrInputDocument solrDocument = new SolrInputDocument();
solrDocument.addField("id", "1");
solrDocument.addField("person", "李彦宏");
solrDocument.addField("company", "百度");
solrClient.add(solrDocument);
// 实体类添加
Info info = new Info();
info.setId("2");
info.setPerson("无名氏");
info.setCompany("无名氏");
solrClient.addBean(info);
// 提交
solrClient.commit();
getAll();
// 经过查询删除
solrClient.deleteByQuery("company:百度");
solrClient.commit();
getAll();
// 经过id删除
solrClient.deleteById("2");
solrClient.commit();
getAll();
}
/* 查询全部 */
public void getAll() throws IOException, SolrServerException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*"); //设置查询参数
QueryResponse response = solrClient.query(solrQuery);
System.out.println("全部信息:");
ArrayList<Info> list = (ArrayList<Info>) response.getBeans(Info.class);
for (Info temp : list) {
System.out.println(temp);
}
}
}
复制代码
测试效果:
本人用到的数据表结构与数据:
导入数据库数据须要把MySQL驱动mysql-connector-java-8.0.15.jar
,Solr目录中dist/
下的solr-dataimporthandler-8.0.0.jar
、solr-dataimporthandler-extras-8.0.0.jar
移动到server/solr-webapp/webapp/WEB-INF/lib
下。
在core的配置文件夹中的solrconfig.xml
中添加:
<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler>
复制代码
以后再在配置文件夹中创建与<str></str>
中同名文件,并进行配置:
<dataConfig>
<dataSource driver="com.mysql.jdbc.Driver" url="你的url" user="你的用户" password="你的密码" />
<document>
<entity name="info" query="select * from info">
<field column="id" name="id" />
<field column="person" name="person" />
<field column="company" name="company" />
</entity>
</document>
</dataConfig>
复制代码
entity
的query
对应得到数据的SQL语句。field
标签中column
对应数据库的字段名,name
对应managed-schema
中的字段名。在运行以前须要确保相应字段已经在managed-schema
中定义,而且可以成功访问到数据库。
先重启一下Solr,而后去管理界面对应Core下的Dataimport
下操做:
Solr官方自带了简体中文分词器HMM Chinese Tokenizer
,存放在contrib/analysis-extras/lucene-libs
下的lucene-analyzers-smartcn-8.0.0.jar
。
首先使用这个插件须要咱们把lucene-analyzers-smartcn-8.0.0.jar
移动到server/solr-webapp/webapp/WEB-INF/lib
下
在对应core下的managed-schema
中添加以下示例配置(来自官方文档示例):
<fieldType name="text_cn" class="solr.TextField">
<analyzer>
<tokenizer class="solr.HMMChineseTokenizerFactory"/>
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.StopFilterFactory" words="你所定义的中文停用词表"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
复制代码
修改完后重启Solr,进入管理界面对应core下的Analysis
,出现fieldType
中对应的name
即为添加成功。
<field name="testChinese" type="text_cn" multiValued="false" indexed="true" stored="true"/>
复制代码
而后添加刚才测试的语句,“今天是假期的最后一天”: