solr 读音应该是叫 “so lar”
之前写过一篇介绍solr的文章https://zhangdianlei.github.io/2018/09/11/Apache-Solr/ ,这里就不再啰嗦solr的事情了。今天搞了一天的solr,现在记录一下
solr安装及使用:
- Linux环境下安装
- 添加环境变量
- 启动solr,简单了解solr
- 新建Core
- 从数据库导入数据
- 数据查询
下面详解介绍每一部分。
Linux环境下安装solr
要求: 电脑上已经装了jdk8+
下载:建一个工作文件夹,执行下载命令:
wget http://mirrors.shuosc.org/apache/lucene/solr/7.5.0/solr-7.5.0.tgz
解压安装:
tar -zxvf solr-7.5.0.tgz
添加环境变量
将solr添加到环境变量,可以快速的启动、重启、关闭等,非常有必要。
编辑文件:
vim /etc/profile
下面是我的配置:
export JAVA_HOME=/root/software/jdk1.8.0_181
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
# solr environment
export SOLR_INSTALL_HOME=/root/solr-7.4.0
export PATH=$SOLR_INSTALL_HOME/bin:$PATH
然后执行:
source /etc/profile
使得配置文件生效
然后可以执行以下命令验证配置成功:
solr start
启动solr,简单了解solr
启动、重启、关闭命令:
solr start
solr restart
solr stop
有时系统因安全问题考虑,可能需要在命令后加上-force
参数
solr启动后,访问 http://ip:8983/solr
之后,将访问web管理界面:
新建Core
每个人新建Core的方法,和配置方法都不一样,在此,仅记录我的创建和配置方法。
先在 Core Admin --> Add Core
确认添加,会报一个找不到文件的错误,然后这时候,需要将标准配置文件,添加到刚才新增的Core下面,标准配置文件在 ~SolrDir/server/solr/configsets/_default/conf
下面,假设当前目录为solr根文件夹下,新的Core名字为new_core
,执行:
cp -r server/solr/configsets/_default/conf server/solr/new_core
新建Core
完成!
导入数据库数据
在上一步导入的Conf目录下,修改以下配置:
在 solrconfig.xml
下添加以下配置,添加位置大约在 680行,SearchHandler
配置上面:
<!-- Request Handlers
http://wiki.apache.org/solr/SolrRequestHandler
Incoming queries will be dispatched to a specific handler by name
based on the path specified in the request.
If a Request Handler is declared with startup="lazy", then it will
not be initialized until the first request that uses it.
-->
<!-- add property -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
<!-- SearchHandler
http://wiki.apache.org/solr/SearchHandler
For processing Search Queries, the primary Request Handler
provided with Solr is "SearchHandler" It delegates to a sequent
of SearchComponents (see below) and supports distributed
queries across multiple shards
-->
data-config.xml
是引用的配置文件,需要新建这个配置文件。在linux下,直接用vim新建即可,vim data-config.xml
,然后 wq
保存退出即可。
该文件的配置如下,连接的是postgresql
,如果是连mysql
的话,需要改一下driver即可(com.mysql.jdbc.Driver
):
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source"
type="JdbcDataSource"
driver="org.postgresql.Driver"
url="jdbc:postgresql://localhost:3306/test_db"
user="root"
password="abc123"
/>
<document>
<entity name="person"
pk="id"
dataSource="source"
query="select * from person"
deltaImportQuery="select * from person where id = '${dih.delta.id}'"
deltaQuery="select id from person where update_date > '${dataimporter.last_index_time}' and status_flag = 'success'">
<field column="id" name="id"/>
<field column="update_date" name="update_date"/>
</entity>
</document>
</dataConfig>
这里,需要添加用到的驱动包,用到什么驱动下载什么,可以从mvn库下载(https://mvnrepository.com/),将数据连接驱动包下载之后,放到solr\server\solr-webapp\webapp\WEB-INF\lib
下,然后将solr{home}\dist目录下的:solr-dataimporthandler-7.4.0.jar和solr-dataimporthandler-extras-7.4.0.jar这两个jar包拷贝到 solr\server\solr-webapp\webapp\WEB-INF\lib下。
简单说一下这三个query的作用:
query: 在全量导入时使用
**deltaImportQuery:**在增量导入时执行,其中的id来自于 deltaQuery 的查询结果。
在这之后,需要配置managed-schema
文件,与数据库进行映射,在117行附近,添加与数据库的映射,具体添加规则,不详细写了。
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
<field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>
<!-- add propertity -->
<field name="invoice_type" type="text_ik" indexed="true" stored="true" />
<field name="invoice_code" type="string" indexed="true" stored="true" />
<field name="invoice_num" type="string" indexed="true" stored="true" />
为了查询的效果,需要再配一下中文分词器,将下面配置放到其中,位置大约在358行:
<fieldType name="text_gen_sort" class="solr.SortableTextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!-- add propertity -->
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false"
class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" useSmart="true"
class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
当然,需要将中文分词包加到项目中,参考这篇文章吧: https://blog.csdn.net/guyan0319/article/details/81188977
数据查询
在solr的web管理界面上,可以执行测试query,具体的每个字段如何查,参考这篇文章:https://blog.csdn.net/sxg0205/article/details/81317563