搜索引擎


ElasticSearch

安装

Centos

#java环境
yum install java -y

#java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)

# 配置账户(出于安全考虑,elasticsearch不允许在root用户下运行)
groupadd elasticsearch
useradd -s /bin/bash -g elasticsearch elasticsearch
vim /etc/sudoers

# 在root下添加
elasticsearch ALL=(ALL) ALL
# 如果不想每次sudo都输密码可以用
elasticsearch ALL=(ALL) NOPASSWD: ALL

passwd elasticsearch xxxxx 修改密码


# 如果以前安装过,清理旧的残留文件
yum remove elasticsearch -y
rm -rf /var/lib/elasticsearch*

#安装Elasticsearch
# 有很多版本,目前最新是6.5.4(安装IK插件可能会提示权限问题),对应修改版本号就行。

# 切换到普通用户,重要!!!
su elasticsearch
cd ~
version=6.2.4
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-$version.rpm
sudo yum localinstall elasticsearch-$version.rpm  -y
rm -rf elasticsearch-$version.rpm

# 配置地址、端口
vim /etc/elasticsearch/elasticsearch.yml

cluster.name: "cluster01"  #集群名,单机随便取,集群每个节点都要统一
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true  # 开启跨域访问支持,默认为false
http.cors.allow-origin: "*"  # 跨域访问允许的域名地址,(允许所有域名)使用正则

# 如果是7.X版本,必须添加以下几行
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*
node.name: node-1
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]

# 启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
注意:如果安装步骤没问题,启动不了,也没报明显错误,重启一下服务器才能启动
#测试是否正常运行
curl http://localhost:9200/

# 后续优化可以配置内存锁、插件等

参考资料:https://www.cnblogs.com/wintersoft/p/10635284.html


Ubuntu

# 登录系统,默认普通用户
sudo apt-get update
sudo apt-get install default-jre

#java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-8u171-b11-0ubuntu0.16.04.1-b11)
OpenJDK 64-Bit Server VM (build 25.171-b11, mixed mode)

# 这里安装的是6.X的ES,使用apt源,要自己指定版本比较麻烦,可以参考Centos的方法。
cd ~
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

sudo apt-get update 
sudo apt-get install elasticsearch

插件、优化

**注意:**安装插件必须要在ES正常运行的情况下,没有启动ES无法安装插件;报错时仔细看信息是连接错误(网络问题、插件找不到)、安装错误。

中文分词、拼音插件

# 版本要和elasticsearch的版本对应
目前我测试过的版本有这些:6.2.4、6.3.2、6.5.4、7.1.0

# 还是要切换到普通用户,且用sudo执行
su elasticsearch
version=6.2.4

# 中文分词插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v$version/elasticsearch-analysis-ik-$version.zip
# 拼音插件
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v$version/elasticsearch-analysis-pinyin-$version.zip


安装完成后重启elasticsearch即可加载插件
sudo systemctl restart elasticsearch


Kibana

ES6.3.2以下版本Kibana和X-Pack插件是独立的,可以只安装X-Pack用于身份认证;Kibana和ES在同一台机器可以开启X-Pack认证或者不开启都可以使用。

建议真机安装Kibana;浏览器安装head插件。
版本要与elasticsearch一一对应(否则无法连接elasticsearch)

Kibana 是为Elasticsearch设计的开源分析和可视化平台,你可以使用 Kibana 来搜索,查看存储在 Elasticsearch 索引中的数据并与之交互。你可以很容易实现高级的数据分析和可视化,以图表的形式展现出来。

# Centos
# 下载地址:https://www.elastic.co/downloads/kibana

sudo elasticsearch
version=6.2.4
wget https://artifacts.elastic.co/downloads/kibana/kibana-$version-x86_64.rpm
sudo yum install -y kibana-$version-x86_64.rpm
rm -f kibana-$version-x86_64.rpm


# Ubuntu
sudo apt-get install kibana

# 修改配置文件
sudo vim /etc/kibana/kibana.yml

server.port: 5601         #监听端口
server.host: "0.0.0.0"    #监听IP地址。
elasticsearch.url: "http://127.0.0.1:9200"  #kibana连接elasticsearch的URL,集群内任一个IP都行(一般填写master或者client的IP)


# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable kibana
sudo systemctl start kibana

sudo ss -antlup | grep 5601

浏览器打开ip:5601访问

安装X-Pack(身份认证)
注意:如果是Elasticsearch 6.3.2 或更新的版本,已经集成了X-Pack,只需要简单改动就可以。

Elasticsearch 6.3.2 或更新的版本
在 Kibana 中访问 Management -> Elasticsearch -> License Management,点击右侧的升级 License 按钮,可以免费试用 30 天的高级 License,升级完成之后页面会显示如下:
mark
另外还可以使用 API 来更新 License,详情可以参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.2/update-license.html。

sudo vim /etc/elasticsearch/elasticsearch.yml
# 开启 Auth 认证功能:
xpack.security.enabled: true

#设置 elastic、kibana、logstash_system 三个用户的密码
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
#运行之后会依次提示设置这三个用户的密码并确认,一共需要输入六次密码,完成之后就成功设置好了密码了。

#重启 Elasticsearch 和 Kibana 服务:
sudo systemctl restart elasticsearch
sudo systemctl restart kibana

另外修改权限认证之后,Elasticsearch也必须输入用户密码才可以访问和调用其 API,保证了安全性。


Elasticsearch 6.3.2以下低版本

# 在Elasticsearch中安装X-pack
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install x-pack
#在Kibana中也安装x-pack
sudo /usr/share/kibana/bin/kibana-plugin install x-pack

# 设置密码
sudo systemctl restart elasticsearch    #重启elasticsearch
sudo /usr/share/elasticsearch/bin/x-pack/setup-passwords interactive
#运行之后会依次提示设置这三个用户的密码并确认,一共需要输入六次密码,完成之后就成功设置好了密码了。
用户名:elastic,kibana,logstash_system  密码:你设置的

# 修改配置
sudo vim /etc/elasticsearch/elasticsearch.yml

#action.auto_create_index : .security,.monitoring*,.watches,.triggered_watches,.watcher-history*
xpack.security.enabled : true
xpack.monitoring.enabled : true
xpack.graph.enabled : false
xpack.watcher.enabled : false
xpack.ml.enabled : false


sudo vim /etc/kibana/kibana.yml
elasticsearch.url: "http://127.0.0.1:9200"   #这里是不变的啊,还是连接的本地。 
elasticsearch.username: "elastic"            #这是内置的特权用户
elasticsearch.password: "your_password"      #这是我们用bin/x-pack/setup-passwords interactive更改后的密码

sudo systemctl restart elasticsearch
sudo systemctl restart kibana
最后终于可以登录了。

首次打开,需要添加索引模式
Management(管理)\-->Index Patterns(索引模式)\-->Create index pattern(创建索引模式)
填写*(索引名)\-->Next step-->选择如:\@timestamp\-->Create index pattern ,完成

Index pattern 下面填写logstash配置的名称如type => "logs"填写logs

参考:https://blog.csdn.net/qq_21383435/article/details/79312247


head插件(集群管理插件)

建议真机安装Kibana;浏览器安装head插件。连接集群要等待几秒才能连接上!

浏览器插件(推荐)

打开chrome的插件中心,拖进去安装。
https://image.leolan.top/elasticsearch5.x-head-chrome.zip

新版本Chrome安全机制变化,可以修改crx格式为zip,并解压;然后Chrome加载已解压的包即可安装。

真机安装head插件

使用root账户执行以下命令

sudo vim /etc/elasticsearch/elasticsearch.yml
# 增加参数,使head插件可以访问es 
http.cors.enabled: true 
http.cors.allow-origin: "*"


# Centos
yum install nodejs
# Ubuntu
apt install node

wget https://github.com/mobz/elasticsearch-head/archive/master.zip
unzip master.zip -d /data/
cd /data/elasticsearch-head-master

# 安装grunt
# grunt是基于Node.js的项目构建工具,可以进行打包压缩、测试、执行等等的工作,head插件就是通过grunt启动
npm install -g grunt-cli
npm install

# 修改配置
vim Gruntfile.js
# 大约在93-95行可以改端口和控制访问,在port前加上以下代码
hostname: '*',
# 注意末尾","

vim _site/app.js  #不改也没关系
# 大约在4354行,改一下localhost为ip,elasticsearch中只运行本地运行,不改也行,改这个可以自动连接elasticsearch。


# 运行服务,浏览器打开ip:9100访问
grunt server &


注意:如果ElasticSearch有设置密码,需要修改ElasticSearch配置文件
vim /etc/elasticsearch/elasticsearch.yml
# 加入以下三行,前两行有重复就不用加
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type 

# 使用elasticsearch或者root用户都可以启动,重点是用elasticsearch用户安装
sudo systemctl restart elasticsearch

# 浏览器访问
http://localhost:9100/?auth_user=elastic&auth_password=you_password

内存锁

系统默认会进行内存交换(swap分区),这样会导致 Elasticsearch 的性能变差。

# 查看状态
http://ip:port/_nodes?filter_path=**.mlockall

{
  "nodes": {
    "GIIszV-zSXehj4UEhNBFeQ": {
      "process": {
        "mlockall": false
      }
    }
  }
}

这代表内存交换没有开启,会影响 Elasticsearch 的性能,所以我们需要开启内存物理地址锁定,每台主机需要修改 

# 开启内存锁
vim /etc/elasticsearch/elasticsearch.yml

bootstrap.memory_lock: true

# 放开系统限制
vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited


vim /etc/systemd/system.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity


# 使用elasticsearch或者root用户都可以启动,重点是用elasticsearch用户安装
sudo systemctl restart elasticsearch

# 还是无法启动,报错:memory locking requested for elasticsearch process but memory is not locked
关闭交换分区
vim /etc/sysctl.conf 
vm.swappiness=0
则需要重启系统,才能让配置生效,或者执行sysctl -p

Solr

Solr也有Docker版,但是貌似只是能运行,无法连接数据库,里面的配置还是要自己改。

Centos 7搭建Solr

安装Solr

要事先安装好JDK1.8

[root@solr ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

不用Tomcat,用Tomcat太麻烦了,开始安装,用root用户安装。
Solr下载:http://archive.apache.org/dist/lucene/solr

cd /root
wget https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/6.6.5/solr-6.6.5.tgz
tar zxvf solr-6.6.5.tgz
# 此时不要删除solr-6.6.5.tgz文件(还有用)

#创建安装目录,比如我安装在/data下,就建立安装目录solr(目录名自己定)
mkdir -p /data/solr

# 建立数据存放目录,软件安装目录
mkdir -p /data/solr/data
mkdir -p /data/solr/soft

# 安装需要用原来下载的压缩包
solr-6.6.5/bin/install_solr_service.sh solr-6.6.5.tgz -d /data/solr/data/ -i /data/solr/soft/

这里只指定了数据目录和安装目录(这两个建议指定,不指定会出现一些问题:solr重启core丢失的问题),要指定其他的加参数,安装完成后自动启动,服务也是自启的。

安装脚本必须用root才能安装。

  • -d solr数据数据目录,比如存放logs,pid文件,core目录等等。默认在/var/solr
  • -i solr程序安装目录,默认在/opt。安装目录必须先创建好。
  • -p 执行solr绑定的端口,默认是8983端口。
  • -s solr服务的名称,默认是solr(会创建对应名称的文件夹)。可以指定别的,比如 lcsolr
  • -u solr服务运行或者solr文件拥有者的用户,默认是solr。也只可以指定别的,如果指定的不存在怎会先创建相关用户
  • -n solr安装完毕之后不启动solr服务

此时浏览器打开IP:8983 就可以访问了,不要在网页中创建core,因为web界面创建Core,默认要求 installdirdatadir 要必须先存在,而且 要求 solrconfig.xml也必须能被找到,所以建议用命令创建core。

扩展jar文件目录在:**/data/solr/soft/solr-6.6.5/server/solr-webapp/webapp/WEB-INF/lib/**之后要安装扩展,把jar文件放在这里,重启solr即可加载。

重启用:systemctl restart solr

日志:/data/solr/data/logs/solr.log


创建core

不要用web界面去创建,没有指定基础目录会创建失败的。

passwd solr  
#更改solr账户的密码,下一行用solr用户(普通用户,root用户无法创建的)创建一个名为TC的core,这里注意可执行文件的路径(在安装目录soft下)
su - solr -c '/data/solr/soft/solr/bin/solr create -c TC'

创建完成后就可以在在web界面中看到新建的core了。
脚本:在/root下创建,方便管理

vim /root/create_new_core.sh

#!/bin/bash
# 核心名
# core_name="XXXXXX"
read -p "请输入Core名,不要使用中文:"  core_name
su - solr -c "/data/solr/soft/solr/bin/solr create -c $core_name"
echo "已成功创建 $core_name"

参考:http://blog.csdn.net/eagle5063/article/details/53889154


链接SQL Server

下载jdbc驱动包:http://msdn.microsoft.com/en-us/data/aa937724.aspx
官网这东西藏的很深,打开网址,滚动到下面,找到这一个链接。
mark
mark
最好下载英文版的,解压出来用jre8那个(因为本地安装的是JDK1.8)

wget https://download.microsoft.com/download/3/F/7/3F74A9B9-C5F0-43EA-A721-07DA590FD186/sqljdbc_6.2.0.0_enu.tar.gz
tar zxvf sqljdbc_6.2.0.0_enu.tar.gz
# 找到mssql-jdbc-6.2.0.jre8.jar移动到/data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib下
mv mssql-jdbc-6.2.0.jre8.jar /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib/

创建数据库链接配置,这个文件是新建的,默认的没有,根据自己的需要修改

vim /data/solr/data/data/TC/conf/data-config.xml

# 参考1   测试数据库:https://image.leolan.top/Mybookshop.rar
<?xml version="1.0" encoding="UTF8"?> 
<dataConfig>
    <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=MyBookShop" user="sa" password="123456"/>
    <document name="Info" pk="id">
        <entity name="zpxx"  transformer="ClobTransformer" pk="id"
                 query="SELECT  [ID],[Title] as name  FROM [MyBookShop].[dbo].[Books]"       
                 deltaImportQuery="SELECT  [Id],[Title] as name  FROM [MyBookShop].[dbo].[Books] where [PublishDate] > '${dataimporter.last_index_time}'"   
                 deltaQuery="SELECT  id FROM [MyBookShop].[dbo].[Books] where [PublishDate] > '${dataimporter.last_index_time}'">            
                    <field column="id"      name="id"      /> 
                    <field column="name"      name="name"      /> 
         </entity>
    </document>
</dataConfig>

#参考2
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
        <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
        url="jdbc:sqlserver://192.168.0.199:1333;DatabaseName=HotelAgentSys" 
        user="sa" 
        password="123456"
        />
        <document name="Info">
                <entity name="Hotel" pk="HotelId"
                        query="select h.[HotelId],h.[Code],he.[Name],he.[Lang] from [HotelAgentSys].[dbo].[Hotel] h
                                   left join [HotelAgentSys].[dbo].[Hotel_Ext] he
                                   on h.[HotelId] = he.[HotelId]"
                        deltaImportQuery="select h.[HotelId],h.[Code],he.[Name],he.[Lang] from [HotelAgentSys].[dbo].[Hotel] h
                                   left join [HotelAgentSys].[dbo].[Hotel_Ext] he
                                   on h.[HotelId] = he.[HotelId]
                                   where h.[HotelId] = '${dataimporter.delta.HotelId}'"
                        deltaQuery="select h.[HotelId],h.[Code],he.[Name],he.[Lang] from [HotelAgentSys].[dbo].[Hotel] h
                                   left join [HotelAgentSys].[dbo].[Hotel_Ext] he
                                   on h.[HotelId] = he.[HotelId]
                                   where h.[ModifyTime] &gt; '${dataimporter.last_index_time}' or he.[ModifyTime] &gt; '${dataimporter.last_index_time}'">
                        <field column="HotelId" name="HotelId" />
                        <field column="Code" name="Code" />
                        <field column="Name" name="Name" />
                        <field column="Lang" name="Lang" />
                </entity>
        </document>
</dataConfig>

query是获取全部数据的SQL(solr从sql中获取那些数据),多列

deltaImportQuery是获取增量数据时使用的SQL(数据库新增数据追加到solr的数据),多列

deltaQuery是获取pk的SQL(数据库新增数据是,追加到solr的数据时的条件,根据id ,条件是最后一次获取的时间,${dataimporter.last_index_time,最后获取的时间}),一列


加载数据库配置文件

vim /data/solr/data/data/TC/conf/solrconfig.xml

#增加一段,引用配置文件
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">/data/solr/data/data/TC/conf/data-config.xml</str>
    </lst>
  </requestHandler>


#再增加一段,目录不确定可以搜索solr-dataimporthandler-*找到路径,也可""内的直接用绝对路径
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-\d.*\.jar" />

OK,重启,系统(修改配置是systemctl restart solr就行,但是初次安装完成不重启系统solr服务是不能正常运行的)再次打开网页,数据库也连接上了。


Windows Server搭建Solr

参考:http://www.cnblogs.com/sunyj/p/6029193.html
http://blog.csdn.net/fwj380891124/article/details/41527171(Tomcat部分配置)


应用、索引操作

参考:http://www.cnblogs.com/madyina/p/4133908.html
http://blog.csdn.net/luwfls/article/details/59114974?utm_source=itdadao&utm_medium=referral


中文分词器

中文分词器用的比较多的是IK Analyzermmseg4j

IKAnalyzer分词器

旧版5.0版IKAnalyzer-5.0.jar或者CSDN下载地址
google code:https://code.google.com/archive/p/ik-analyzer/downloads?page=1

推荐6.3版ik-analyzer-solr-6.3.0.jar
这是经过修改的分词器,支持自定义字典,且每分钟刷新字典,修改字典后不需要重启solr。
原文:http://www.cnblogs.com/liang1101/articles/6395016.html
项目:https://github.com/liang68/ik-analyzer-solr6

编译过程(可跳过):配置好Maven环境参考:java jdk环境搭建,在本地克隆项目之后进入目录,运行mvn clean install完成之后会生成ik-analyzer-solr-6.3.0.jar文件和IKAnalyzer.cfg.xml文件

参考:https://my.oschina.net/crxy/blog/412202

# jar都可以放在此目录,这个目录下的jar默认是加载的。
cd /data/solr/soft/solr-6.6.5/server/solr-webapp/webapp/WEB-INF/lib/
wget https://image.leolan.top/ik-analyzer-solr-6.3.0.jar
cd ~

参考:
https://www.cnblogs.com/johnwood/p/6673694.html?utm_source=itdadao&utm_medium=referral
http://www.cnblogs.com/madyina/p/4131751.html

配置分词器

编辑core目录下的managed-schema文件,加入字段

# 每个core的conf文件夹下
vim /data/solr/data/data/leo_test/conf/managed-schema

# 引用分词器,根据自己的业务修改
   <field name="HotelId" type="string" indexed="true" stored="true" required="false" multiValued="false" />
   <field name="Code" type="text_ik" indexed="true" stored="true" required="false" multiValued="false" />
   <field name="Name" type="text_ik" indexed="true" stored="true" required="false" multiValued="false" />
   <field name="Lang" type="string" indexed="true" stored="false" required="false" multiValued="false" />

# 定义分词器
# 这里加入了ik.conf文件,用于1分钟扫描一次词库是否有变化。原文:http://www.cnblogs.com/liang1101/articles/6395016.html
<fieldType name="text_ik" class="solr.TextField">
        <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        <analyzer type="index">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf" />
          <filter class="solr.StopFilterFactory" ignoreCase="false" words="stopwords.txt" />
        </analyzer>
        <!--查询时候的分词器-->
        <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
        <analyzer type="query">
          <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf" />
          <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        </analyzer>
</fieldType>
<!--把英文单词拆开成一个一个字符的分词器-->
<fieldType name="text_letter" class="solr.TextField">
       <analyzer type="index">
                  <tokenizer class="solr.NGramTokenizerFactory"/>
                </analyzer>
                <analyzer type="query">
                  <tokenizer class="solr.NGramTokenizerFactory"/>
                </analyzer>
</fieldType>

配置字典

这是配置全局词库,只要在managed-schema文件空引用了ik分词器就可以使用这些词库;单独配置的话在单独的core中创建IKAnalyzer.cfg.xml文件词库文件;这两个文件要在同一个目录,然后设置managed-schema引用。

mkdir /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/classes
cd /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/classes
vim 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">mydict.dic;</entry>

        <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords">stopword.dic;</entry>
</properties>

# 保存退出

# 新建词典mydict.dic和stopwords.dic一行一个词,直接用vim是没问题的
# 在win上记得用notepad++转换为UTF-8无BOM编码,换行符为Unix(LF)。有BOM的第一行留空也可以;不然是无法识别的。
chmod 755 ./*.dic

配置1分钟自动刷新词库

在需要引用的core目录下,且managed-schema中配置了引用ik.conf文件。

vim ik.conf

lastupdate=1
files=/data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/classes/mydict.dic

程序通过扫描lastupdate的变化值来确定词库有无更新,是否需要重新加载,所以每次修改词库后就修改一下lastupdate的数字,比如加1
files后是词库路径,在core下的话可以直接写词库名,多个词库用;号隔开,修改ik.conf文件不用重启。

重启solr就生效了。
为了方便编辑字典,也可以链接到/root下

ln -s /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/classes/mydict.dic /root/mydict.dic
ln -s /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/classes/stopwords.dic /root/stopwords.dic
ln -s /data/solr/data/data/XXXcore/conf/ik.conf /root/ik.conf
#全局词库一个ik.conf链接就行,刷新后所有配置的词库都会刷新

mmseg4j分词器

http://blog.csdn.net/robertohuang/article/details/60961353
https://github.com/chenlb/mmseg4j-solr


定时实时重建索引和增量更新

cp /data/solr/soft/solr-6.6.0/dist/solr-dataimporthandler-6.6.0.jar \
/data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib/
cp /data/solr/soft/solr-6.6.0/dist/solr-dataimporthandler-extras-6.6.0.jar \
/data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib/

# 自动更新的jar包,官方的太旧了,而且有错,这里用第三方博客中提供的附件。
# 这里有多个jar包,任选一个,我在测试时发现第一个jar会导致系统非常卡,第二个还行。
# 第一个jar包
wget https://image.leolan.top/apache-solr-dataimportscheduler-1.1.jar \
-p /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib/

# 第二个jar包
wget https://image.leolan.top/solr-dataimport-scheduler.jar \
-p /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/lib/


# 修改配置
vim /data/solr/soft/solr-6.6.0/server/solr-webapp/webapp/WEB-INF/web.xml

在servlet项前面增加:
<listener>
    <listener-class>
        org.apache.solr.handler.dataimport.scheduler.ApplicationListener
    </listener-class>  
</listener>

# 配置更新规则
# 在/solr_home/下新建conf文件夹(不是/solr_home/(创建的core)/)
mkdir /data/solr/data/data/conf
vim /data/solr/data/data/conf/dataimport.properties
# 值后面不要有多余空格!!!

# 内容如下(按实际情况修改):

#################################################  
#                                               #  
#       dataimport scheduler properties         #  
#                                               #  
#################################################  
  
#  to sync or not to sync  
#  1 - active; anything else - inactive  开启同步
syncEnabled=1

#  which cores to schedule  
#  in a multi-core environment you can decide which cores you want syncronized  
#  leave empty or comment it out if using single-core deployment  
#  要同步的core
syncCores=XXXSys_City,XXXSys_XXX,XXXSys_Place

#  solr server name or IP address  
#  [defaults to localhost if empty]  
server=localhost

#  solr server port  端口
#  [defaults to 80 if empty]  
port=8983

#  application name/context  
#  [defaults to current ServletContextListener's context (app) name]  
webapp=solr

#  URL params [mandatory]  
#  remainder of URL  
#增量更新
#params=/select?qt=/dataimport&command=delta-import&clean=false&commit=true
params=/dataimport?command=delta-import&clean=false&commit=true&optimize=false&wt=json&indent=true&verbose=false&debug=false
# 下面这种多了参数entity=user
params=/dataimport?command=delta-import&clean=false&commit=true&optimize=false&wt=json&indent=true&entity=user&verbose=false&debug=false

#  schedule interval  增量更新间隔时间
#  number of minutes between two runs  
#  [defaults to 30 if empty]  
interval=20


#  重做索引的参数(不想重做索引可以注释以下内容)
#reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true&optimize=true&wt=json&indent=true&entity=students&verbose=false&debug=false

#  重做索引的时间间隔,单位分钟,默认7200,即1天;   
#  为空,为0,或者注释掉:表示永不重做索引  
reBuildIndexInterval=7200

#  重做索引时间间隔的计时开始时间(第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000)
#  两种格式:2018-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期  
reBuildIndexBeginTime=07:00:00


# 重启solr
systemctl restart solr
# 日志
tail -f /data/solr/data/logs/solr.log

参考:
https://blog.csdn.net/luvsnow/article/details/78678492


解决时区差8小时的问题

vim /etc/default/solr.in.sh

#SOLR_TIMEZONE="UTC"
改为:
SOLR_TIMEZONE="UTC+8"

性能优化JVM参数调优

修改Jvm-Memory值
Solr6后不要用-server -Xms1536m -Xmx1536m这样的参数了,会导致solr挂掉;直接修改配置值。

vim /data/solr/soft/solr-6.6.0/bin/solr
# 修改Jvm-Memory值,搜索Xss,值从256修改为512
# 修改${SOLR_HEAP:-512m}为${SOLR_HEAP:-2048m} 这里主机内存是8G,设置2048(设置4096会导致系统异常变慢,原因未知。)

JAVA_MEM_OPTS=()
if [ -z "$SOLR_HEAP" ] && [ -n "$SOLR_JAVA_MEM" ]; then
  JAVA_MEM_OPTS=($SOLR_JAVA_MEM)
else
  SOLR_HEAP="${SOLR_HEAP:-2048m}"
  JAVA_MEM_OPTS=("-Xms$SOLR_HEAP" "-Xmx$SOLR_HEAP")
fi

# Pick default for Java thread stack size, and then add to SOLR_OPTS
if [ -z ${SOLR_JAVA_STACK_SIZE+x} ]; then
  SOLR_JAVA_STACK_SIZE='-Xss512k'
fi
SOLR_OPTS+=($SOLR_JAVA_STACK_SIZE)

mark

调整优化参数

# 可以改为一下参数;具体参数看参考链接

  # define default GC_TUNE
  if [ -z ${GC_TUNE+x} ]; then
      GC_TUNE=('-XX:NewRatio=3' \
        '-XX:SurvivorRatio=65535' \
        '-XX:TargetSurvivorRatio=90' \
        '-XX:MaxTenuringThreshold=0' \
        '-XX:+UseConcMarkSweepGC' \
        '-XX:+UseParNewGC' \
        '-XX:ConcGCThreads=4' \
        '-XX:ParallelGCThreads=4' \
        '-XX:+CMSScavengeBeforeRemark' \
        '-XX:PretenureSizeThreshold=64m' \
        '-XX:+UseCMSInitiatingOccupancyOnly' \
        '-XX:CMSInitiatingOccupancyFraction=90' \
        '-XX:CMSMaxAbortablePrecleanTime=6000' \
        '-XX:-CMSParallelRemarkEnabled' \
        '-XX:+ParallelRefProcEnabled' \
        '-XX:PermSize=256M' \
        '-XX:MaxPermSize=256M' \
        '-Xnoclassgc' \
        '-XX:+DisableExplicitGC' \
        '-XX:+UseCMSCompactAtFullCollection' \
        '-XX:CMSFullGCsBeforeCompaction=0' \
        '-XX:+CMSClassUnloadingEnabled' \
        '-XX:SoftRefLRUPolicyMSPerMB=0' \
        '-XX:+PrintClassHistogram' \
        '-XX:+PrintGCDetails' \
        '-XX:+PrintGCTimeStamps' \
        '-XX:+PrintHeapAtGC' \
        '-Xloggc:/data/solr/data/logs/gc.log' \
        '-XX:-OmitStackTraceInFastThrow')

# '-XX:-CMSParallelRemarkEnabled 参数可以改为试试+CMSParallelRemarkEnabled;

参考:
https://blog.csdn.net/liangpz521/article/details/39081089
https://www.cnblogs.com/ggjucheng/p/3977612.html


参考:
https://blog.csdn.net/sinat_21184471/article/details/77193462
https://www.jianshu.com/p/7a95f5d90cfa
https://blog.csdn.net/zwx19921215/article/details/43152307
https://blog.csdn.net/yxue1118/article/details/51800145


xunsearch(迅搜)

Xunsearch 是免费开源的专业全文检索解决方案,旨在帮助一般开发者针对既有的海量数据,快速而方便地建立自己的全文搜索引擎。全文检索可以帮助您降低服务器搜索负荷、极大程度的提高​​​搜索速度和用户体验。
http://www.xunsearch.com

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
环境搭建 ELK Xunsearch Solr Elasticsearch
喜欢就支持一下吧