一,
solr
的下载
http://lucene.apache.org/solr/
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 文件夹复制到合适位置。
2,solr项目里配置 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>
http://127.0.0.1:8080/solr 正常打开页面说明配置成功。
六,添加 solr core (索引库)
打开 solr home 文件夹,复制 collection1 (原有的索引库)并改个名字 collection2 ,
打开新的索引库 collection2 ,修改 core.properties 文件内容,把: name=collection2
Dataimport 批量导入,可以一次导入大量的原始数据,请参考:
Documents 对文档进行增删改的操作,里面可以写 JSON 等格式,但域名要先声明再使用,请参考:八、 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>
5 ,使用域类型添加域名
<field name="title_ik" type="text_ik" indexed="true" stored="true" multiValued="true" />
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>
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 进行删除再添加。
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
http://lucene.apache.org/solr/
解压到合适的位置,以4.10.3为例。solr是一个服务,里面有solr项目war包。
二,找到solr的war包
solr-4.10.3\dist 目录下有: solr-4.10.3.warsolr-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 文件夹复制到合适位置。
2,solr项目里配置 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>
http://127.0.0.1:8080/solr 正常打开页面说明配置成功。
六,添加 solr core (索引库)
打开 solr home 文件夹,复制 collection1 (原有的索引库)并改个名字 collection2 ,
打开新的索引库 collection2 ,修改 core.properties 文件内容,把: name=collection2
重新启动tomcat就可以了。
七,了解 sorl 页面1,左面主菜单
2,索引库菜单
Dataimport 批量导入,可以一次导入大量的原始数据,请参考:
Documents 对文档进行增删改的操作,里面可以写 JSON 等格式,但域名要先声明再使用,请参考:八、 solr 的域
Query 对索引库的查询
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,重启tomcat,solr项目里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