这里我们直接开始搭建服务器,如果需要了解solr,请访问solr官网,笔者就不在这里说明了。
- solr服务器下载
wget http://apache.fayea.com/lucene/solr/6.3.0/solr-6.3.0.tgz
或者访问solr下载
下载完成后,解压到工作目录
tar -zxvf solr-6.3.0.tgz
#移动到我的工作目录下
mv solr-6.3.0 /Users/yangyang/Workspaces/
cd /Users/yangyang/Workspaces/solr-6.3.0/bin
#启动solr 默认端口8983
./solr start
启动成功如下图
我们直接访问一下,显示界面表示我们已经成功运行了solr服务器
我们完成了上面solr服务器搭建和运行,接下来,我们开始尝试配置我们的solr服务器吧,这里,我们先进行schema配置,也是最重要的地方,配置错误会导致solr服务器不能正常工作,现在就开始吧
- 我们先创建一个core
#进入solr所在目录
cd /Users/yangyang/Workspaces/solr-6.3.0/
cd server/solr/
#创建core目录
mkdir -pv blog/conf
#复制基础配置文件
cp -r configsets/basic_configs/conf/* blog/conf/
接下来进入solr管理界面,按下图操作,然后点击Add Core
下面截图表示core创建成功
进行下面步骤之前,我们还需要了解一些managed-schema配置文件,这里就不介绍了,可以查看配置文件 managed-schema (schema.xml)(1)、配置文件 managed-schema (schema.xml)(2)、配置文件 managed-schema (schema.xml)(3)、配置文件 managed-schema (schema.xml)(4)
- 加入smartcn中文分词(lucene-analyzers-smartcn-6.3.0.jar)(备注:也可以选择其他分词jar,笔者暂时使用的smartcn),把下载的分词jar拷贝到${user.solr.path}/server/solr-webapp/WEB-INF/lib
中。
- 修改managed-schema中配置,使用我们加入的中文分词
在managed-schema(创建的core的conf文件夹下)搜索
替换
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
注意:请把index
、query
两个类型的tokenizer
都替换,不然会导致全文检索时出错,不能按预先的index
设置进行检索。
- 设置field
与 copyField
,这里我使用了当前博客系统全文检索配置文件进行说明
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false"/>
<field name="_version_" type="long" indexed="true" stored="false"/>
<field name="title" type="text_general" indexed="true" stored="true"/>
<field name="content" type="text_general" indexed="true" stored="true"/>
<field name="sketch" type="text_general" indexed="true" stored="true"/>
<field name="columnNamesCache" type="text_general" indexed="true" stored="true"/>
<field name="labelNamesCache" type="text_general" indexed="true" stored="true"/>
<field name="columnIdsCache" type="string" stored="true"/>
<field name="labelIdsCache" type="string" stored="true"/>
<field name="main_photo" type="string" stored="true"/>
<field name="author_head_img" type="string" stored="true"/>
<field name="author_nickname" type="string" stored="true"/>
<field name="author_id" type="string" stored="true"/>
<field name="statistics" type="long" stored="true"/>
<field name="status" type="boolean" stored="true"/>
<field name="creatTime" type="long" stored="true"/>
<field name="text" type="text_general" multiValued="true" indexed="true" stored="true"/>
<uniqueKey>iduniqueKey>
<copyField source="title" dest="text"/>
<copyField source="content" dest="text"/>
<copyField source="sketch" dest="text"/>
<copyField source="columnNamesCache" dest="text"/>
<copyField source="labelNamesCache" dest="text"/>
上面展示了一些简单的配置,这里的配置也是solr中比较重要的地方,具体配置需要依据功能而定,请读者自行测试。
接下来我们重启solr服务(默认已进入{Solr.path}/bin)
./solr stop -all
./solr start
确定成功后,我们可以进入solr管理页面查看core是否配置正确。正确情况下,选择我们的core,进入Schema管理可以看到新添加的配置信息,如下图
配置信息也可以直接在管理页面中添加,笔者个人喜欢直接修改manger-schema配置文件。到此,schema配置就结束了,solr更多基础示例可以直接访问Apache Solr
solrj的作用是方便我们在Java服务端快捷调用solr API,具体介绍可以查看solrj wiki
我们在Spring 配置中添加如下配置文件
<bean id="httpSolrServerBlog" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
<constructor-arg index="0" value="${solr.Url}"/>
<property name="parser">
<bean class="org.apache.solr.client.solrj.impl.XMLResponseParser"/>
property>
<property name="connectionTimeout" value="${solr.connectionTimeout}"/>
bean>
在配置信息中添加
solr.Url=http://localhost:8983/solr/blog
solr.connectionTimeout=500
在使用环境中,只需要注入即可.
private final SolrClient solrClient;
@Autowired
public SolrUtilImpl(SolrClient solrClient) {
this.solrClient = solrClient;
}
如果使用了多个solr core,只需要定义多个been,使用不同ID,需要那个been就注入那个been。
这里只介绍solrj的一些简单使用,详情请点击solrj wiki查看
前面我们已经成功启动了solr,现在我们通过solrj访问solr服务器,进行文档的CURD操作。
备注:还可以通过数据库方式进行文档同步
package org.blog.entity;
//省略import 信息
public class BlogArticle{
private Long id;
private String name; //标题
private String mainPhoto; //封面图片
private String sketch; //简述
private String content; //详细描述
private String contentMd; //详细描述 markdown
private Boolean ifTop; //是否置顶
private VUser user; //本文发布者
private String sources; //来源
private String staticCode; //静态码
private BigDecimal sorter;
private Boolean status; //状态
private String creater;
private Timestamp lastUpdateTime;
private Timestamp creatTime;
private String columnNamesCache;
private String columnIdsCache;
private String labelIdsCache;
private String labelNamesCache;
//省略set get 方法 VUser为用户对象 里面保存用户头像 昵称 等信息
}
SolrInputDocument
对象的公共方法 SolrInputDocument
是solrj提供的与solr服务器进行文档操作的对象模型 /**
* 获取solr全文检索对象
*
* @param tempVo 文档
* @return 全文检索对象
*/
public SolrInputDocument getSolrInputDocument(BlogArticle tempVo) {
//添加solr
SolrInputDocument document = new SolrInputDocument();
document.addField("id", tempVo.getId());
document.addField("title", tempVo.getName());
document.addField("content", HtmlUtil.Html2Text(tempVo.getContent())); //方便检索,取消html标签等字符
document.addField("sketch", tempVo.getSketch());
document.addField("columnNamesCache", tempVo.getColumnNamesCache());
document.addField("columnIdsCache", tempVo.getColumnIdsCache());
document.addField("labelIdsCache", tempVo.getColumnIdsCache());
document.addField("labelNamesCache", tempVo.getLabelNamesCache());
document.addField("creatTime", tempVo.getCreatTime().getTime());
document.addField("main_photo", tempVo.getMainPhoto());
document.addField("author_head_img", tempVo.getUser().getHeadImg()); //头像
document.addField("author_nickname", tempVo.getUser().getNickName()); //昵称
document.addField("author_id", tempVo.getUser().getId()); //id
document.addField("status", tempVo.getStatus());
return document;
}
HtmlUtil
工具类 package org.blog.util;
import com.fangshuo.common.log.Logger;
import java.util.regex.Pattern;
/**
* @author Created by yangyang on 2016/11/18.
* e-mail :[email protected] ; tel :18580128658 ;QQ :296604153
*/
public class HtmlUtil {
private static final Logger logger = Logger.getLogger(HtmlUtil.class); //自己的日志
public static String Html2Text(String inputString) {
String htmlStr = inputString; //含html标签的字符串
String textStr = "";
java.util.regex.Pattern p_script;
java.util.regex.Matcher m_script;
java.util.regex.Pattern p_style;
java.util.regex.Matcher m_style;
java.util.regex.Pattern p_html;
java.util.regex.Matcher m_html;
java.util.regex.Pattern p_other;
java.util.regex.Matcher m_other;
try {
String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; //定义script的正则表达式{或