(一)solr搜索服务的搭建

一, solr 的下载
http://lucene.apache.org/solr/

解压到合适的位置,以4.10.3为例。solr是一个服务,里面有solr项目war包。

二,找到solrwar

solr-4.10.3\dist 目录下有: solr-4.10.3.war
solr-4.10.3\example\webapps
目录下有: solr.war
这两个是一样的项目。把它放到 tomcat 下启动就可以解压,或是直接解压到 tomcat 下。
三,添加
solr jar
solr-4.10.3\example\lib\ext 目录下的所有 Jar 包放到 solr 项目里面。
四,配置
solrhome
1
solrhome 的位置
solr-4.10.3\example\solr 目录下的所有东西就是 solrhome 应该有的所有文件。
里面的
collection1 就代表一个独立的索引库,叫 solr core 。可以有多个。
solr 文件夹复制到合适位置。
2solr项目里配置 solrhome
solr
项目里面 tomcat-solr\webapps\solr\WEB-INF 下面有 web.xml 文件
有注释的配置
<!--
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>/put/your/solr/home/here</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>
</env-entry>
-->
把注释打开,并把 put your solr home here 改成 solr home 的实现路径。
<env-entry>
<env-entry-name>solr/home</env-entry-name>
<env-entry-value>D:\tomcat\solrhome</env-entry-value>
<env-entry-type>java.lang.String</env-entry-type>

</env-entry>


五,启动并访问 solr
http://127.0.0.1:8080/solr 正常打开页面说明配置成功。
六,添加
solr core (索引库)
打开
solr home 文件夹,复制 collection1 (原有的索引库)并改个名字 collection2
打开新的索引库
collection2 ,修改 core.properties 文件内容,把: name=collection2

重新启动tomcat就可以了。

七,了解 sorl 页面

1,左面主菜单



2,索引库菜单


Analyse 分词可以使用不同的域,这些域的定义参考:八、 solr 的域
Dataimport 批量导入,可以一次导入大量的原始数据,请参考:
Documents 对文档进行增删改的操作,里面可以写 JSON 等格式,但域名要先声明再使用,请参考:八、 solr 的域

Query 对索引库的查询



八,solr 的域
1 solr 中的域名要先声明再使用,文档里面必须有 id 域。
2 solr 中怎么声明域名
solr home 里面的索引库的配置文件中: solrhome\collection2\conf schema.xml
1
),里面有声明域:(相当于要储存的属性)
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
域名为: name="title"
域值类型为: type="text_general"
是否索引: indexed="true"
是否存储: stored="true"
是否多值: multiValued="true" 一个关键字可对应多个值。
其中:
text_general 类型的解释
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
.. </fieldType> 其实就是 TextField 类型。
2 ),动态域
<dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true"/>
动态的匹配以 _txt 结尾的域名
3 ), ID
<uniqueKey>id</uniqueKey> 这个就相当于库表的 ID ,是必须有并且唯一的。
4 ),复制域(将多个域复制到一个域可以进行相当于模糊查询)
<copyField source="cat" dest="text"/>
<copyField source="name" dest="text"/>
在添加域值 cat name 的时候,也自动添加到 text 域里面,这样查询的时候查 text 域就可以了。
5 ),域类型
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
这个可以自定义分词分析器:参考九,用 IK 分词分析器和自定义域类型和域名
九,用
IK 分词分析器(正向迭代最细粒度切分算法)和自定义域类型和域名
1 ,把 IK Jar 包放在 solr 项目里面
tomcat-solr\webapps\solr\WEB-INF\lib 里面放入: IKAnalyzer2012FF_u1.jar
2
,把 IK 的配置文件放入 solr 项目的 classpath 里面, tomcat-solr\webapps\solr\WEB-INF 下应该有个
classes 文件夹,如果没有,创建一个就好了,把: ext.dic IKAnalyzer.cfg.xml stopword.dic 放进去
3 ,在 solr home 里面的索引库的配置文件中: solrhome\collection2\conf schema.xml ,打开此文件。
4 ,添加域类型

<fieldType name="text_ik" class="solr.TextField">

<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
5
,使用域类型添加域名
<field name="title_ik" type="text_ik" indexed="true" stored="true" multiValued="true" />

6,保存并重启tomcat就可以用自定义的域和分词分析器了。


十,批量导入数据库数据
1 ,分析源数据,进行自定义域
分析每一个属性
是否要分词:是用整个查询还是分词查询。
是否要建索引:是不是用来查询。
是否要存储:就看查询出来的东西是不是要显示。
是否多值:看对应的关系是不是一对多。
solr home 里面的索引库的配置文件中: solrhome\collection2\conf schema.xml 中,配置域名
2 ,添加批量导入插件
1 ),导包:
a ,在索引库里创建文件夹 lib
b
,找到 solr-4.10.3\dist 目录下面有:
solr-dataimporthandler-4.10.3.jar
solr-dataimporthandler-extras-4.10.3.jar
数据库驱动包放入
lib 文件夹下。
2 ),修改配置
a ,在索引库的配置文件里( solrhome\collection2\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>
b
,新建 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>

3,重启tomcatsolr项目里dataimport功能可查看。


十一,页面上对索引库的增删改查操作
1 ,增加
1 ),单个的文档添加 在 documents 功能里,编辑文档格式,(可以用 JSON 格式),点 submit
document
,比如说: {"id":"change.me","title":"change.me"} 就是添加一个 ID change.me 的文档,标题内
容是:
change.me
2
),批量增加参考:十,批量导入数据库数据
2 ,删除
1 ),用文档的 ID 进行删除
documents 功能里编辑(用 XML 格式)
<delete>
<id>
这里写文档的 ID</id>
</delete>
<commit />
2
),用查询删除
documents 功能里编辑(用 XML 格式)
<delete>
<query>title:
这里面是 lucene 的查询语法 </query>
</delete>
<commit />

3 ,修改
修改和增加是一样的,只要库时里已经存在这个
ID 了,它就会对这个 ID 进行删除再添加。

4,查询

十二, solr 在代码中的使用
1 ,找到 solr 的客户端 solrJ
solrJ
solr-4.10.3\dist 目录下,有 solr-solrj-4.10.3.jar 包和 solrj-lib 文件夹,还有 solr-
4.10.3\example\lib\ext
里面的所有 jar 包都是 solrJ 所需要的 jar 包。
2 因为 solr 是一个 web 服务,所以我们要有一个访问它的地
址:
String url = "http://127.0.0.1:8080/solr/collection2" ; 后面跟的是要连接的索引
库名,如果不写,默认第一个。
3 ,连接 solr 服务
HttpSolrServer hss = new HttpSolrServer( url );
4 ,新增(更新)输入文档对象
SolrInputDocument sid = new SolrInputDocument();
sid .addField( "id" , " 这是 ID" );
sid .addField( " 这里面是已经声名的域名 " , " 域的值 " );
hss .add( sid );
hss .commit();
5 ,删除文档对象
1 ),用 ID 删除
hss .deleteById( " 这里可以是个 ID ,也可以是一个 ID List" );
hss .commit();
2 ),用查询删除
hss .deleteByQuery( " 这里面是 lucene 的查询方法 " );
hss .commit();
6 ,查询文档对象
1 ),基础查询
要有查询对象,设置条件,进行查询,得到结果
// 查询对象
SolrQuery sq = new SolrQuery();
// 设置条件 :sq.set("q", "*:*");
sq .setQuery( "*:*" );
// 执行查询
QueryResponse qr = hss .query( sq );
// 得到查询结果
SolrDocumentList sdl = qr .getResults();
System.
out .println( " 总查询出来的条数: " + sdl .getNumFound());
// 显示结果
for (SolrDocument sd : sdl ){
Object
obj = sd .getFieldValue( "id" );
System.
out .println( obj );
}
2 ),高级查询
参考后面页面来进行设置查询条件
// 查询对象
SolrQuery sq = new SolrQuery();
// 设置条件
sq .setQuery( "*:*" );
// 设置过滤条件
sq .setFilterQueries( "title: 测试 " , "price:[0 TO 20]" , "name: 天天 " );
// 设置排序
sq .setSort( " 要排序的域 " , ORDER. desc );
// 设置从那里开始
sq .setStart(0);
// 设置取出多少条
sq .setRows(10);
// 设置要返回的域
sq .setFields( " 显示名称就写名称的域 " , " 显示单价就写单价的域 " );
// 设置默认查询域
sq .set( "df" , " 默认查询域 " );
// 开启高亮显示
sq .setHighlight( true );
// 设置高亮的域
sq .addHighlightField( " 高亮的域 " );
// 设置高亮的前缀
sq .setHighlightSimplePre( " 高亮前缀 " );
// 设置高亮的后缀
sq .setHighlightSimplePost( " 高亮后缀 " );
// 执行查询
QueryResponse qr = hss .query( sq );
// 得到查询结果
SolrDocumentList sdl = qr .getResults();
System.
out .println( " 总查询出来的条数: " + sdl .getNumFound());
// 显示结果
for (SolrDocument sd : sdl ){
Object
obj = sd .getFieldValue( "id" );
System.
out .println( obj );
// 取高亮
Map<String, Map<String, List<String>>> map = qr .getHighlighting();
// ID 得到数据,再得到高亮显示的内容
List<String> list = map .get( obj ).get( "name" );
Object
name = null ;
if ( list != null && list .size() >0){
name = list .get(0);
}
else {
name = sd .getFieldValue( "name" );
} S
ystem.
out .println

猜你喜欢

转载自blog.csdn.net/weixin_39494923/article/details/79482484
今日推荐