## 3. Solr搭建及使用
### 3.1 Solr下载
官网:
```
htpp://lucene.apache.org
```

### 3.2 solr配置
#### 3.2.1 配置solr与tomcat整合:
1. 下载一个干净的tomcat:
```
官网:http://tomcat.apache.org
下载:apache-tomcat-8.5.38
jdk:1.8
```
2. 将下载好的solr7.7.1解压缩

3. 将`solr-7.7.1\server\solr-webapp\`路径下的`webapp`改名为`solr`后拷贝到`apache-tomcat-8.5.38\webapps\`路径下
4. 将`solr-7.7.1\server\lib\ext`路径下的所有jar包拷贝到`apache-tomcat-8.5.38\webapps\solr\WEB-INF\lib`下

5. 将`solr-7.7.1\server\lib`下的以`metrics-`开头和`gmetrics-`开头的jar包拷贝到`apache-tomcat-8.5.38\webapps\solr\WEB-INF\lib`下

7. 在`apache-tomcat-8.5.38\webapps\solr\WEB-INF`目录下建立一个`classes`文件夹用于存放`log4j.properties`的配置文件记录日志
8. 复制`solr-7.7.1\server\resources`目录下的`log4j2.xml`配置文件到`apache-tomcat-8.5.38\webapps\solr\WEB-INF\classes`下。

然后打开`log4j2.xml`配置日志的存放路径:

#### 3.2.2 配置solr的家目录
1. 选一个目录存放`solr`的`home`目录我的建立在和tomcat存放目录的同级,新建一个`solrhome`文件夹作为solr的`home`目录

2. 将`solr-7.7.1\server\solr`目录下的所有文件及文件夹拷贝到`solrhome`文件夹中,在将`contrib`和`dist`两个文件夹复制到`solrhome`中

得到:

3. 在tomcat的solr工程文件夹的web.xml中即`apache-tomcat-8.5.38\webapps\solr\WEB-INF`下的web.xml中声明solrhome的位置:增加一行如下:
```xml
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<!-- 写自己创建的solrhome的位置-->
<env-entry-value>F:/solr/solorhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
```
然后注释到web.xml中的如下配置:
```xml
<!-- Get rid of error message -->
<!--
<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>
-->
```
到这里solr配置就结束了,然后启动tomcat服务器访问
```
http://localhost:8080/solr/index.html
```
可以看到首页

**注意:如果tomcat无法通过`startup.bat`启动,看到界面一闪而过,则需要配置JRE的环境变量:**

其中变量值为你安装`java`的目录的`jre`文件夹的路径
然后在`Path`环境变量中加入一行:
```
%JRE_HOME%\bin
```
就可以启动了。
### 3.3 solr创建Core
solr的`Core`就是`Solr`存放数据或者说是索引的地方,本质是一个文件夹,位置在solr的home目录下。
在solr管理首页点击`Core Admin`

然后点击`Add Core`

点击`Add Core`,我们认为会在core home路径下,创建了一个名为coreTest的文件夹并完成core的创建,然而并不是。

报错了,上方红色报错信息中指出的路径即为core home路径(由于上面两张图是盗来的所以看到版本和路径不对,但是不影响),就是我们刚刚创建的`solrhome`文件夹
找到solrhome文件夹在里面会发现只有coreTest文件夹是一个空的,core并未成功创建,因为我们缺少solrconfig.xml,将之前复制到solrhome中的`solorhome\configsets\_default`文件夹 下的`conf`文件夹复制到
`coreTest`文件夹下,再次回到首页点击`Add Core`核就创建成功了。

点击`Core Selector`可以选择创建的Core查看具体信息

点击`schema`可以添加域:

涉及到的域的类型就域Lucene一致了,这里不再赘述。
**界面中的一些菜单介绍:**
1. Dashboard:
仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、ivm等信息。
2. Logging Solr
运行日志信息。
3. Cloud
Cloud 即 Solrdoud,即Sor云(集群),当使用Solr Cloud模式运行时会显示此菜单,如下图是Solr Cloud的管理界面:
4. Core Admin
Solr Core的管理界面。Solr Core是Solr的一个独立运行实例单位,它可以对外提供索引和搜索服务,一个Solr工程可以运行多个Solrcore(Solr实例),一个Core 对应一个索引目录。
添加solrcore:
第一步:复制 collection1改名为collection2第二步:修改core.properties。name=collection2第三步:重启tomcat
5. java properties
Solr在JVM运行环境中的属性信息,包括类路径、文件编码、ivm内存设置等信息。
6. Tread Dump
显示SolrServer中当前活跃线程信息,同时也可以跟踪线程运行栈信息。
7. Analysis
通过Analysis的界面可以测试索引分析器和搜索分析器的执行情况。
8. Dataimport
可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。
9. Document.
通过此菜单可以创建索引、更新索引、删除索引等操作。
### 3.4 配置IK中文分词器
#### 3.4.1 Managed-schema介绍
Managed-schema,在Solr创建的Core的conf目录下如:`solorhome\collection1\conf`,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括Fieldlypes、Fields和其他的一些缺省设置。

#### 3.4.2 安装IK中文分词器
第一步:把`IK-Analyzer-7.2.1.jar`添加到`apache-tomcat-8.5.38\webapps\solrsolr\WEB-INF\ib`目录下。
第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到`apache-tomcat-8.5.38\webapps\solr\WEB-INF\classes`下。
第三步:配置Core的managed-schema文件`solorhome\collection1\conf`
```xml
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
<field name="content_ik" type="text_ik" indexed="true" stored="false"/>
```
保存,重启`tomcat`就可以使用`IK分词器`了
在`solr`管理页面选择核然后选择`analysis`就可以查看分词效果了

### 3.5 批量导入数据
使用dataimport插件批量导入数据。
第一步:把dataimport 插件依赖的jar包添加到solrcore中路径:`collection1\lib`(collection1时核名称,没有lib文件夹需要创建一个)中。

还需要连接mysql数据库所以导入mysql的驱动包`mysql-connector-java-5.1.46-bin.jar`
第二步:配置核的核心配置文件`solrconfig.xml`(目录:`solorhome\collection1\conf`),在其中添加一个`requestHandler`
```xml
<!-- 配置导入数据的requestHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
```
配置中涉及到`data-config.xml`配置文件用于存放数据库连接信息,在`solrconfig.xml`同级目录下创建一个`data-config.xml`

然后配置上:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/lucene"
user="root"
password="123456"/>
<document>
<entity name="product" query="SELECT pid, name, catalog, price, picture, shop_name, market_time FROM product">
<field column="pid" name="id"/>
<field column="name" name="product_name"/>
<field column="catalog" name="product_catalog"/>
<field column="price" name="product_price"/>
<field column="picture" name="product_picture"/>
<field column="shop_name" name="product_shop_name"/>
<field column="market_time" name="product_market_time"/>
</entity>
</document>
</dataConfig>
```
导入`lucene.sql`即可建表。
由于将数据库字段映射为`solr`域而solr中没有定义这些域,所以就需要手动配置。
下面就来说明关于设置业务系统Field。
#### 3.5.1 设置业务系统Field
如果不使用Solr提供的Field 可以针对具体的业务需要自定义一套Field,如下是商品信息Field:
```xml
<-- product,在solr7中float,double之类的都是系统自带pfloat,pdouble -->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price" type="pfloat" indexed="true" stored="true"/>
<field name="product_picture" type="string" indexed="false" stored="true"/>
<field name="product_catalog" type="text_ik" indexed="true" stored="true"/>
<field name="product_shop_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_keywords" type="text_ik" indexed="true" stored="false"
multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_catalog" dest="product_keywords"/>
<copyField source="product_shop_name" dest="product_keywords"/>
```
其中`product_keywords`是新增加的一个多值域,而`copyField`则是用于拷贝,将`product_name`,`product_catalog`,`product_shop_name`拷贝到`product_keywords`域中,这样在搜索的时候就不需要分别搜索那三个域,而是直接搜索`product_keywords`一次就可以返回搜索结果,提高搜索速度。
将上面的配置文件复制到核的`managed-schema`配置文件中(`solorhome\collection1\conf\managed-schema`):

配置好这些以后,重启服务器会可以打开`dataimport`了
#### 3.5.2 导入数据


Lucene&Solr学习笔记之三Solr搭建及使用