solr 配置多个entity_深圳嘉华学校之Solr搜索文档说明

Solr使用教程

目录

一、软件版本... 2

二、安装教程... 2

1、Solr安装教程... 2

2、solr环境搭建... 4

3、业务字段的实际配置... 7

4、dataimport 导入数据库数据... 8

5、solrj的使用... 10

6、电商平台的应用... 14

一、软件版本

Solr版本号:solr-5.5.5

jdk版本号:jdk1.8以上

Tomcat版本号:Tomcat8.0以上

二、安装教程

1、Solr安装教程

1.创建solrhome以及solrcore(mysolrhome、mycore 名字可以任意指定)

1.1在指定的目录下新建文件夹solrhome如:D:mysolrhome

1.2将solr-5.5.4serversolrsolr.xml拷贝至 D:mysolrhome

1.3在solrhome下新建文件夹solrcore如D:mysolrhomemycore

1.4将solr-5.5.4serversolrconfigsetsbasic_configsconf完整目录拷贝至D:mysolrhomemycore下

2.部署到Tomcat

2.1将solr-5.5.4serversolr-webappwebapp 完整目录复制到Apache Tomcat 8.0.27webapps下并重命名为solr

2.2在Apache Tomcat 8.0.27webappssolrWEB-INF下新建classes文件夹

2.3将solr-5.5.4/server/resource/log4j.properties 拷贝至上一步创建的classes

2.4把solr-5.5.4/server/lib/ext/目录下的所有jar文件复制到Apache Tomcat 8.0.27/webapp/solr/WEB-INF/lib/中

3.配置solrcore

3.1修改Apache Tomcat 8.0.27-solrwebappssolrWEB-INFweb.xml 新增<env-entry>标签,将你的solrhome配置进去。

<env-entry>

<env-entry-name>solr/home</env-entry-name>

<env-entry-value>F:mysolrhome</env-entry-value>

<env-entry-type>java.lang.String</env-entry-type>

</env-entry>

0f3c154cda476989a8e8655c14040cc9.png

3.2这个时候启动Tomcat,在浏览器中输入http://127.0.0.1:8080/solr/admin.html来访问到solr的控制界面了,接下来就是创建solrCore,即在solr的管理控制台界面,添加一个core1

5fbf19d97222301d384c3764655217da.png

4.安装IK分词器

4.1准备好ik分词器的jar包,然后把它复制到tomcat/webapp/solr/WEB-INF/lib里面。(千万不要复制到tomcat/lib中,这样会找不到lucene的类)

4.2打开solrHome/core1/conf/managed-schema文件,在最下方,追加如下配置

<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>

5.重新启动tomcat 即可看到text_ik分词

b7de28486af86d88708e501a7f714870.png

2、solr环境搭建

1. 插入的文档必须与域相匹配

域,我个人也称它为字段,它在solr中有特定的含义,就类似数据库中表的列一样,规范着写入的数据,我们先来做个例子。

3ea97d5d3dcc2955861aa2971c4dfb1b.png

可以看到,我这次插入的文档,有id,title当然,在solr中,每一条记录都必须有着一个唯一的id,它就类似数据库中的主键,不可重复。这条记录的插入是成功的。

但是,如果我把title改成title1,这就与定义的字段不一样了,就会报错,如下图所示

f9145a508de60c2943a63a0232ecefc6.png

可以看到,这里提示,未知的字段 title1.

1.1域的定义 field

先拿出一条配置来看一下

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

认识一下这些属性

name:域名

type:域的类型,必须匹配类型,不然会报错

indexed:是否要作索引

stored:是否要存储

required:是否必填,一般只有id才会设置

multiValued:是否有多个值,如果设置为多值,里面的值就采用数组的方式来存储,比如商品图片地址(大图,中图,小图等)

1.2配置动态域 dynamicField

同样的,也先拿出一条来看看

<dynamicField name="*_i" type="string" indexed="true" stored="true" multiValued="true" />

何谓动态域呢?就是这个域的名称,是由表达式组成的,只要名称满足了这个 表达式,就可以用这个域

同样的认识一下这些属性

name:域的名称,该域的名称是通过一个表达式来指定的,只要符合这这个规则,就可以使用这个域。比如 aa_i,bb_i,13_i等等,只要满足这个表达式皆可

type:对应的值类型,相应的值必须满足这个类型,不然就会报错

indexed:是否要索引

stored:是否要存储

...其它的属性与普通的域一至

1.3主键域 uniqueKey

给出一条配置

<uniqueKey>id</uniqueKey>

指定一个唯一的主键,每一个文档中,都应该有一个唯一的主键,这个值不要随便改

1.4复制域 copyField

给出一条配置

<copyField source="cat" dest="text"/>

说明一下相应的属性

source:源域

dest:目标域

复制域,将源域的内容复制到目标域中

注意:目标域必须是允许多值的,如下,nultiValued必须为true,因为可能多个源域对应一个目标域,所以它需要以数组来存储

<field name="text" type="string" indexed="true" stored="true" multiValued="true"/>

1.5域的类型 fieldType

同样的给出一段配置,这段稍微有点复杂

3b3c103ebc5c8eaeb47282fb0591c1d2.png

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">

<analyzer type="index">

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

<!-- in this example, we will only use synonyms at query time

<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>

-->

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

<analyzer type="query">

<tokenizer class="solr.StandardTokenizerFactory"/>

<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

<filter class="solr.LowerCaseFilterFactory"/>

</analyzer>

</fieldType>

3b3c103ebc5c8eaeb47282fb0591c1d2.png

给出相应属性的说明

name:域的名称

class:指定solr的类型

analyzer:分词器的配置

type: index(索引分词器),query(查询分词器)

tokenizer:配置分词器

filter:过滤器

3、业务字段的实际配置

经过上面的学习,差不多了解了一些常用的配置,如今我们用field来配置实际的业务字段,有属性如下

58b48ab783c2a44f99060b275e1da404.png

当然,中文分词还是要用的,因为我们在前面的 1.2 章节中,已经配置了一个fieldType的中文分词,所以我们现在一律用中文分词的域类型

主键的id就不需要配置了,默认已经把id配置为主键了,默认的配置如下

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

人物名称(需要分词,需要存储)

<field name="name" type="text_ik" indexed="true" stored="true" />

商品描述(需要分词,不需要存储)

<field name="description" type="text_ik" indexed="true" stored="false" />

复制域的应用

前面我们了解了复制域,但是却不知道它的应用场景,现在我们结合实际情况来讲一下复制域

用户在搜索框搜索的时候,有可能输入的是商品名称,也有可能输入的是商品描述,也有可能输入的是一个商品类型,那么这些值的搜索,肯定在后台是对应一个域的,那么既然如此,我们就可以把这些域合并成一个,这样在后台只需要单独的对这一个域进行搜索就可以了

先定义一个目标域

<field name="keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

复制域,把人物名称,人物描述复制到上面的这个域中

<copyField source="name" dest="keywords"/>

<copyField source="description" dest="keywords"/>

4、dataimport 导入数据库数据

solr默认是没有开启dataimport这个功能的,所以我们要经过一点配置来开启它

1.首先找到solr5.5/dist/solr-dataimporthandler-5.5.2.jar,把这个文件复制到tomcat/webapp/solr/WEB-INF/lib/下,并且找到相应数据库的驱动包,也同样放到该目录。我这里用的是mysql的驱动包。

2.找到solr5.5/example/example-DIH/solr/db/conf/db-data-config.xml,把其复制到solrHome/mycore/conf/下,并改名为data-config.xml.

3.找到solrHome/mycore/conf/solrconfig.xml,并打开,在里面添加一段内容,如下

3b3c103ebc5c8eaeb47282fb0591c1d2.png

<requestHandler name="/dataimport" class="solr.DataImportHandler">

<lst name="defaults">

<str name="config">data-config.xml</str>

</lst>

</requestHandler>

3b3c103ebc5c8eaeb47282fb0591c1d2.png

4.打开并编辑data-config.xml,完整的配置文件如下

3b3c103ebc5c8eaeb47282fb0591c1d2.png

<dataConfig>

<!-- 这是mysql的配置,学会jdbc的都应该看得懂 -->

<dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/smbms " user="root" password="root"/>

<document>

<!-- name属性,就代表着一个文档,可以随便命名 -->

<!-- query是一条sql,代表在数据库查找出来的数据 -->

<entity name="test_person" query="select * from test_person ">

<!-- 每一个field映射着数据库中列与文档中的域,column是数据库列,name是solr的域(必须是在managed-schema文件中配置过的域才行) -->

<field column="id" name="id"/>

<field column="name" name="name"/>

<field column="description" name=description"/>

</entity>

</document>

</dataConfig>

3b3c103ebc5c8eaeb47282fb0591c1d2.png

5.重启tomcat,然后会看到如下页面

0a6805b2d3ca0a70b8740f3683ed5e93.png

6.点击蓝色的按钮,则开始导入,导入过程依据数量量的大小,需要的时间也不同,可以点击右边的Refresh status来刷新状态,可以查看当前导入了多少条。

7.导入成功如下

f1fd79534a74177e289a70c390cc7175.png

、solrj的使用

上面已经讲完了solr的安装与配置,现在说一下使用solrj来维护solr的索引及操作,solrj就是一个java的客户端,是一个jar包的使用

首先导入一下jar包:

d598ba198519bacd6fff8544ae73abaf.png

5.1增加及修改

首先说明,在solr中,增加与修改都是一回事,当这个id不存在时,则是添加,当这个id存在时,则是修改

代码很好理解,直接给出

private String serverUrl = "http://192.168.1.4:8080/solr/core1";

/**

* 增加与修改<br>

* 增加与修改其实是一回事,只要id不存在,则增加,如果id存在,则是修改

* @throws IOException

* @throws SolrServerException

*/

@Test

public void upadteIndex() throws SolrServerException, IOException{

//创建

HttpSolrClient client = new HttpSolrClient(serverUrl);

SolrInputDocument doc = new SolrInputDocument();

doc.addField("id", "7");

doc.addField("name", "赵丽颖");

doc.addField("description", "这是一好演员");

client.add(doc);

client.commit();

client.close();

}

5.2删除索引

/**

* 删除索引

* @throws Exception

*/

@Test

public void deleteIndex()throws Exception{

HttpSolrClient client = new HttpSolrClient(serverUrl);

//1.删除一个

client.deleteById("7");

//2.删除多个

List<String> ids = new ArrayList<>();

ids.add("1");

ids.add("2");

client.deleteById(ids);

//3.根据查询条件删除数据,这里的条件只能有一个,不能以逗号相隔

client.deleteByQuery("id:7");

//4.删除全部,删除不可恢复

client.deleteByQuery("*:*");

//一定要记得提交,否则不起作用

client.commit();

client.close();

}

5.3查询

package test;

import java.util.List;

import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;

import org.apache.solr.client.solrj.impl.HttpSolrClient;

import org.apache.solr.client.solrj.response.QueryResponse;

import org.apache.solr.common.SolrDocument;

import org.apache.solr.common.SolrDocumentList;

import org.junit.Test;

/**

* 搜索

* @author Administrator

*

*/

public class IndexSearch {

private String serverUrl = "http://192.168.1.4:8080/solr/core1";

@Test

public void search()throws Exception{

HttpSolrClient client = new HttpSolrClient(serverUrl);

//创建查询对象

SolrQuery query = new SolrQuery();

//q 查询字符串,如果查询所有*:*

query.set("q", "id:6");

//fq 过滤条件,过滤是基于查询结果中的过滤

//query.set("fq", " name:周");

//sort 排序,请注意,如果一个字段没有被索引,那么它是无法排序的

//query.set("sort", "");

//start row 分页信息,与mysql的limit的两个参数一致效果

query.setStart(0);

query.setRows(10);

//fl 查询哪些结果出来,不写的话,就查询全部,所以我这里就不写了

//query.set("fl", "");

//df 默认搜索的域

query.set("df", "product_keywords");

//======高亮设置===

//开启高亮

query.setHighlight(true);

//高亮域

query.addHighlightField("product_name");

//前缀

query.setHighlightSimplePre("<span style='color:red'>");

//后缀

query.setHighlightSimplePost("</span>");

//执行搜索

QueryResponse queryResponse = client.query(query);

//搜索结果

SolrDocumentList results = queryResponse.getResults();

//查询出来的数量

long numFound = results.getNumFound();

System.out.println("总查询出:" + numFound + "条记录");

//遍历搜索记录

//获取高亮信息

Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();

for (SolrDocument solrDocument : results) {

System.out.println("人物id:" + solrDocument.get("id"));

System.out.println("人物名称 :" + solrDocument.get("product_name"));

System.out.println("人物描述:" + solrDocument.get("product_description"));

//输出高亮

Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));

List<String> list = map.get("product_name");

if(list != null && list.size() > 0){

System.out.println(list.get(0));

}

}

client.close();

}

}

注意:没有索引的域,是不能用作排序的

6、电商平台的应用

详见项目案例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值