文章目录
1. Solr简介
Lucene是API是类库,solr是基于Lucene开发的一个项目
2. 搭建环境
2.1 复杂搭建
-
第一步:安装tomcat。D:\temp\apache-tomcat-7.0.53
-
第二步:把solr的war包复制到tomcat 的webapp目录下。
把\solr-4.10.3\dist\solr-4.10.3.war复制到D:\temp\apache-tomcat-7.0.53\webapps下。
改名为solr.war
-
第三步:solr.war解压。使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war
-
第四步:把\solr-4.10.3\example\lib\ext目录下的所有的jar包添加到solr工程中
-
第五步:配置solrHome和solrCore。
1)创建一个solrhome(存放solr所有配置文件的一个文件夹)。\solr-4.10.3\example\solr目录就是一个标准的solrhome。
2)把\solr-4.10.3\example\solr文件夹复制到D:\temp\0108路径下,改名为solrhome,改名不是必须的,是为了便于理解。
3)在solrhome下有一个文件夹叫做collection1这就是一个solrcore。就是一个solr的实例。一个solrcore相当于mysql中一个数据库。Solrcore之间是相互隔离。
i. 在solrcore中有一个文件夹叫做conf,包含了索引solr实例的配置信息。
ii. 在conf文件夹下有一个solrconfig.xml。配置实例的相关信息。如果使用默认配置可以不用做任何修改。
Xml****的配置信息:
Lib:solr服务依赖的扩展包,默认的路径是collection1\lib文件夹,如果没有 就创建一个
dataDir:配置了索引库的存放路径。默认路径是collection1\data文件夹,如 果data文件夹,会自动创建。
requestHandler**:**
第六步:告诉solr服务器配置文件也就是solrHome的位置。修改web.xml使用jndi的方式告诉solr服务器。
Solr/home****名称必须是固定的。
第七步:启动tomcat
第八步:访问http://localhost:8080/solr/
2.2 简单搭建
- 准备一个tomcat
- 吧dist中的war拷贝到tomcat的wabapps文件下
- 吧war解压
- 配置solrHome
- 吧\example \solr 下的全部文件拷贝到指定的位置
- 陪孩子slor项目与solrHome的关系,修改solr项目的web.xml 中的 solr/home 的value
- 添加solr项目运行的拓展包,吧example\lib\ext下的所有jar包放到solr项目中
- 重新启动tomcat
- 访问
2.3 搭建7.X
- 官网下载zip
- 解压
- 添加自己的core
1、创建core目录 在/chowdate/solr-7.4.0/server/solr目录下创建new_core目录(名字自己定) 2、复制配置文件 复制/chowdate/solr-7.4.0/server/solr/configsets/_default下的conf文件夹到/chowdate/solr-7.4.0/server/solr/new_core/下。 3、添加core 在页面添加new_core(必须先做上面1、2步,不然会提示报错)。
- 设置第三方分词器
- 下载ik-analyzer-solr7
- 将jar包放入Solr服务的Jetty或Tomcat的webapp/WEB-INF/lib/目录下;
- 将resources目录下的5个配置文件放入solr服务的Jetty或Tomcat的webapp/WEB-INF/classes/目录下;
① 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">ext.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
② ext.dic ③ stopword.dic ④ ik.conf ⑤ dynamicdic.txt
- 配置Solr的managed-schema,添加ik分词器,示例如下;
<!-- ik分词器 --> <fieldType name="text_ik" class="solr.TextField"> <analyzer type="index"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> <analyzer type="query"> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
- ik.conf文件说明:
files=dynamicdic.txt lastupdate=0
- dynamicdic.txt 为动态词典
在此文件配置的词语不需重启服务即可加载进内存中。 以#开头的词语视为注释,将不会加载到内存中。
3. solr core 类比成mysql的database
- 添加solr core 的步骤
- 从collection1得到文件位置
- 复制文件夹 改名
- 修改该文件夹下的core.properties
- 从启tomcat
4. 使用solr控制台
4.1 添加索引
document中
- solr中的域名是先定义后使用
- 添加文档时id不能少
4.2 删除索引
document中 选择xml
- 语法1:更具id
<delete>
<id>1</id>
</delete>
<commit/>
- 语法2:更具语法
<delete>
<query>id:2</query>
</delete>
<commit/>
删除所有
<delete>
<query>*:*</query>
</delete>
<commit/>
4.3 查询
- q为查询
*:*
id:1
等等
- fq为过滤条件
products_name:[0 TO 100]
[]为包含 {}为不包含 支持通配符* - sort 为排序
id asc
asc升序 desc降序 - fl 为只显示那些列
id,title
- df 是默认域 df填写了列 那么q只用填写值
- HL下面 hl.fl写列名
5. java代码操作solr——solrJ
- 导入jar包
- solrJ核心包 dist\solr-solrj-xxx.jar
- solrJ扩展包 dist\solrj-lib下的全部
- solr的扩展包 example\lib\ext下的所有
5.1 添加到索引库
@Test
public void addIndex() throws IOException, SolrServerException {
// 1. 获取solr的服务器用于连接solr项目
SolrServer solrServer = new HttpSolrServer("http://localhost/solrs/collection1");
// 2. 执行slorServer的添加方法
SolrInputDocument doc = new SolrInputDocument();
doc.addField("name", "solrJ添加");
doc.addField("content", "solrJ添加内容");
doc.addField("id", "2");
solrServer.add(doc);
solrServer.commit();
}
5.2 修改索引
/**
* 修改
* @throws Exception
* @throws IOException
*/
@Test
public void updateIndex() throws Exception, IOException{
//1、获取solr的服务器 用于连接solr项目
SolrServer solrServer = new HttpSolrServer("http://localhost/solrs/collection1");
//2、执行solrServer的添加方法
SolrInputDocument doc = new SolrInputDocument();
doc.addField("name", "solrJ添加name修改");
doc.addField("content", "solrJ添加的内容修改");
doc.addField("id", "2");
solrServer.add(doc);
solrServer.commit();
}
5.3 删除索引
/**
* 删除
* @throws Exception
* @throws IOException
*/
@Test
public void deleteIndex() throws Exception, IOException{
//1、获取solr的服务器 用于连接solr项目
SolrServer solrServer = new HttpSolrServer("http://localhost/solrs/collection1");
solrServer.deleteById("change.me");
//solrServer.deleteByQuery("id:2");
//solrServer.deleteByQuery("*:*");
solrServer.commit();
}
5.4 查询
/**
* 查询
* @Author chenpeng
* @Description //TODO
* @Date 23:52
* @Param []
* @return void
**/
@Test
public void searchIndex() throws Exception, IOException{
//1、获取solr的服务器 用于连接solr项目
SolrServer solrServer = new HttpSolrServer("http://localhost/solrs/collection1");
//2、设置查询条件
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
//3、执行
QueryResponse queryResponse = solrServer.query(solrQuery);
//4、获取结果
SolrDocumentList results = queryResponse.getResults();
System.out.println("总记录数:"+results.getNumFound());
for (SolrDocument doc : results) {
System.out.println(doc.get("id"));
System.out.println(doc.get("name"));
System.out.println(doc.get("content"));
}
}
6. 添加自定义域名
- 找到配置文件 SolrCore下
config/schema.xml
6.1 属性
6.1.1 field
<field name="_version_" type="long" indexed="true" stored="true"/>
name域名称
type域类型
indexed是索引
stored 是否存储
required 必须要有的
multivalued 是否可以多值
6.1.2 dynamicField
<dynamicField name="*_i" type="int" indexed="true" stored="true"/>
name 中的值为通配符
6.1.3 uniqueKey
为一的
<uniqueKey>id</uniqueKey>
###6.1.4 copyField
<copyField source="cat" dest="text"/>
source 源域名
dest 目标域名
6.1.5 fieldType
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
name 类型名称
class 类
6.2 自定义
- 第一步:把IKAnalyzer2012FF_u1.jar添加到solr/WEB-INF/lib目录下。
- 第二步:复制IKAnalyzer的配置文件和自定义词典和停用词词典到solr的classpath下。
- 第三步:在schema.xml中添加一个自定义的fieldType,使用中文分析器。
<!-- IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
- 第四步:定义field,指定field的type属性为text_ik
<!--IKAnalyzer Field-->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
- 第五步:重启tomcat
6.3 demo
6.3.1修改配置文件
修改solrHome\collection1\conf\schema.xml
<!-- 商品名称 属性为自定义的 type为是否为索引 stored为是否存储原文 -->
<field name="products_name" type="text_ik" indexed="true" stored="true" />
<!--价格-->
<field name="products_price" type="float" indexed="true" stored="true" />
<!--内容-->
<field name="products_description" type="text_ik" indexed="true" stored="false" />
<!--图片-->
<field name="products_picture" type="stirng" indexed="false" stored="true" />
<!--分类-->
<field name="products_catalog_name" type="String" indexed="true" stored="true" />
<!--设置商品名称和内容-->
<field name="products_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<!--复制进去 名称和内容-->
<copyField source"products_name" dest="products_keywords"/>
<copyField source"products_description" dest="products_keywords"/>
<!--设置第三方分割文字的jar包-->
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
6.3.2 导入数据 低版本
定义dataimport-handler步骤:
- 打开collection1/conf/solrconfig.xml
- 如果是老版本就导入包 到solrHomex\collection1\lib 如果没有就创建 新版本无需
- dist\ solr-dataimporthandler-extras-4.10.3.jar
- solr-dataimporthandler-4.10.3.jar
- 在solrconfig.xml中添加如下配置
<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 version="1.0" encoding="UTF-8" ?> <dataConfig> <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/lucene" user="root" password="root"/> <document> <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products "> <field column="pid" name="id"/> <field column="name" name="product_name"/> <field column="catalog_name" name="product_catalog_name"/> <field column="price" name="product_price"/> <field column="description" name="product_description"/> <field column="picture" name="product_picture"/> </entity> </document> </dataConfig>
- 在schema.xml中添加域,这才能查出来
<!-- products Field -->
<field name="product_name" type="text_ik" indexed="true" stored="true" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />
<field name="product_price" type="float" indexed="true" stored="true" />
<field name="product_description" type="text_ik" indexed="true" stored="false" />
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_release_time" type="date" indexed="true" stored="true" />
<!-- products copyField -->
<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>
- 重启tomcat
6.4.3 导入数据 7.X版本
导入数据库中的数据到Solr中
-
创建data-config.xml文件
在/chowdate/solr-7.4.0/server/solr/new_core/conf目录下创建一个文件data-config.xml,与solrconfig.xml同级 -
修改solrconfig.xml文件
修改/chowdate/solr-7.4.0/server/solr/new_core/conf/solrconfig.xml文件
在上放增加以下这段代码。
<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文件,将它们关联起来。
- 修改data-config.xml文件
接下来我们打开data-config.xml文件,配置相关的数据库属性,即我们要导入那张表的哪些字段,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<dataConfig>
<dataSource name="source1" type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://10.10.9.103:3306/auth-cas"
user="root"
password="****"
batchSize="-1" />
<document>
<entity name="user" dataSource="source1"
query="SELECT uid,user_code,account,password,user_name,gender,last_login_time,update_time FROM uap_tb_gmvcs_user">
<field column='uid' name='uid' />
<field column='user_code' name='user_code' />
<field column='account' name='account' />
<field column='password' name='password' />
<field column='user_name' name='user_name' />
<field column='gender' name='gender' />
<field column='last_login_time' name='last_login_time' />
<field column='update_time' name='update_time' />
</entity>
</document>
</dataConfig>
dataSource 中,url是你要访问的数据库路径,我这里指定到我的auth-cas 数据库。user是用户名,password是你的数据库密码。
query是一个sql语句,你需要导入哪张表的哪些字段,查就行了。然后标签中的column属性是你SQL语句中查询的字段,跟数据库中对应;name属性是你给它起的一个别名,应该是必须指定的(本人没试过不指定的结果),至于name属性是干嘛的,继续往下操作,自然会明白。有多个查询字段就需要有多个标签,每一个标签对应一个字段。
document配置数据库查询语句与managed_schema域的对应关系。目的是,在core导入数据的时候,会先通过该配置信息链接到数据库通过查询语句把数据查询出来,通过数据库字段与managed_schema域关联关系创建索引
- 修改managed-schema文件
修改/chowdate/solr-7.4.0/server/solr/new_core/conf/managed-schema文件,将刚才在data-config.xml中配置的标签添加进来。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<!-- docValues are enabled by default for long type so we don't need to index the version field -->
<field name="_version_" type="plong" indexed="false" stored="false"/>
<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
<field name="_text_" type="text_general" indexed="true" stored="false" multiValued="true"/>
<!-- 上面是原有的的字段 -->
<!-- 自己的导入的字段 -->
<field name="uid" type="string" indexed="true" stored="true" />
<field name="user_code" type="string" indexed="true" stored="true" />
<field name="account" type="string" indexed="true" stored="true" />
<field name="password" type="string" indexed="true" stored="true" />
<field name="user_name" type="string" indexed="true" stored="true" />
<field name="gender" type="string" indexed="true" stored="true" />
<field name="last_login_time" type="pdate" indexed="true" stored="true" />
<field name="update_time" type="pdate" indexed="true" stored="true" />
这里里的name属性值,就是我们刚才在data-config.xml中标签的name属性值,这是name属性的第一个用途,关联起来。
name:是这个域的名称,在整个managed_schema文件里面需要唯一,不能重复,这里定义成跟数据库表字段的名称,方便使用。当然,也可以定义成其他名字。
type:是表示这个字段的类型是什么,string是字符串类型,int是整形数据类型,date是时间类型,相当于数据库里面的timestamp。
indexed:表示是否索引,索引的话就能查询到,否则,搜索的时候,不会出现。
stored:表示是否存储到索引库里面。
required:是否必须
multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field想存储多个值的话,必须将multiValued设置为true
- 下载连接数据库和导入数据的jar包
现在涉及到数据库了,肯定需要依赖一些jar包,下载三个jar包 下载地址:http://mvnrepository.com/
mysql-connector-java-8.0.11.jar
solr-dataimporthandler-7.7.0.jar
solr-dataimporthandler-extras-7.7.0.jar
三个jar包 放到/chowdate/solr-7.4.0/server/solr-webapp/webapp/WEB-INF/lib 目录下
然后打开solr-7.7.0/server/solr/new_core/conf/solrconfig.xml,引用上面提到的jar包,如下。
<!-- mysql导入增加的包开始-->
<lib dir="${solr.install.dir:../../../..}/dist/" regex="mysql-connector-java-.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
<!-- mysql导入增加的包结束-->
关闭然后重启 ./bin/solr stop -all ./bin/solr start -force
- 导入数据
再次访问我们刚才的页面,在左侧找到我们部署好的new_core工程,点击Dataimport,再选择full-import(全部导入),点击Execute,出现下面的页面,证明这张表的数据已经导入进来了。