什么是solr?
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
solr整合Tomcat步骤
第一步:安装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之间是相互隔离。
第六步:告诉solr服务器配置文件也就是solrHome的位置。修改web.xml使用jndi的方式告诉solr服务器。
Solr/home名称必须是固定的。
第七步:启动tomcat
第八步:访问http://localhost:8080/solr/
copyField(复制域)
copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索
根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中,如下:
<copyField source="title" desc="text">
<copyField source="content" desc="text">
dynamicField(动态字段)
动态字段就是不用指定具体的名称,只要定义字段名称的规则,
例如定义一个 dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的
例如:name_i,gender_i,school_i等。
安装中文分词器
第一步:把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
使用Analyse测试
使用数据库批量导入数据(MySQL)
第一步:把dataimport插件依赖的jar包添加到solrcore(collection1\lib)中
\solr-4.10.3\dist
solr-dataimporthandler-4.10.3.jar
solr-dataimporthandler-extras-4.10.3.jar
还需要mysql的数据库驱动
第二步:配置solrconfig.xml文件,添加一个requestHandler。
<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,保存到collection1\conf\目录下
<?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>
第四步:添加业务Field 在schema.xml添加
<!--product-->
<field name="product_name" type="text_ik" 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_catalog_name" type="string" indexed="true" stored="true" />
<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
操作语句
删除
1) 删除制定ID的索引
<delete>
<id>8</id>
</delete>
<commit/>
2) 删除查询到的索引数据
<delete>
<query>product_catalog_name:幽默杂货</query>
</delete>
3) 删除所有索引数据
<delete>
<query>*:*</query>
</delete>
查询索引
查询所有:
*:*
范围查询:
域名:[值 TO 值]、域名:{值 TO 值]、域名:[值 TO 值}、域名{值 TO 值}
也可以使用“*”表示无限,例如:
20以上:product_price:[20 TO *]
20以下:product_price:[* TO 20]
排序:
<field name>+<desc|asc>[,<field name>+<desc|asc>]
分页:
从0开始、显示条数
fl - 指定返回那些字段内容,用逗号或空格分隔多个
df-指定一个默认搜索Field
wt - (writer type)指定输出格式,
可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
使用SolrJ管理索引库
jar包:
solr-4.10.3\dist\solrj-lib
下全部jar包共8个
solr-4.10.3\dist
solr-solrj-4.10.3.jar
其他
commons-logging-1.2.jar
1 package cn.solr.demo;
2
3
4 import java.util.List;
5 import java.util.Map;
6
7 import org.apache.solr.client.solrj.SolrQuery;
8 import org.apache.solr.client.solrj.SolrQuery.ORDER;
9 import org.apache.solr.client.solrj.SolrServer;
10 import org.apache.solr.client.solrj.SolrServerException;
11 import org.apache.solr.client.solrj.impl.HttpSolrServer;
12 import org.apache.solr.client.solrj.response.QueryResponse;
13 import org.apache.solr.common.SolrDocument;
14 import org.apache.solr.common.SolrDocumentList;
15 import org.apache.solr.common.SolrInputDocument;
16 import org.junit.Test;
17
18 /**
19 * solr 单机版测试
20 * @author xiaou
21 *
22 */
23 public class SolrDemo {
24 @Test
25 //添加索引
26 public void testAdd() throws Exception {
27 //1.连接solr服务器
28 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
29 SolrInputDocument doc = new SolrInputDocument();
30 doc.addField("id", "c0001");
31 doc.addField("product_catalog_name", "爱你");
32 solrServer.add(doc);
33 solrServer.commit();
34 }
35
36 @Test
37 //删除索引
38 public void testDelete() throws Exception {
39 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
40 solrServer.deleteById("c0001");
41 solrServer.commit();
42 }
43
44 @Test
45 //修改索引
46 //通过先删后增的方式进行修改
47 public void testUpdate() throws Exception {
48 //1.连接solr服务器
49 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
50 SolrInputDocument doc = new SolrInputDocument();
51 doc.addField("id", "c0001");
52 doc.addField("product_catalog_name", "爱你咯");
53 solrServer.add(doc);
54 solrServer.commit();
55 }
56
57 @Test
58 //简单查询
59 public void queryIndex() throws Exception {
60 //1.连接solr服务器
61 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
62 //2.创建查询对象
63 SolrQuery query = new SolrQuery();
64 //3.设置查询条件
65 query.setQuery("*:*");
66 //4.执行查询
67 QueryResponse response = solrServer.query(query);
68 //5.取回结果集
69 SolrDocumentList results = response.getResults();
70 System.out.println("共有"+results.getNumFound()+"条记录");
71 System.out.println("-------------------------------------------------");
72 //6.遍历结果集
73 for (SolrDocument solrDocument : results) {
74 System.out.println("商品id "+solrDocument.get("id"));
75 System.out.println("商品名称 "+solrDocument.get("product_name"));
76 System.out.println("商品价格 "+solrDocument.get("product_price"));
77 System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
78 System.out.println("-----------------------------------------------------------");
79 }
80 }
81 @Test
82 //复杂查询
83 //查询、过滤、分页、排序、高亮
84 public void queryIndex2() throws Exception {
85 SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/myCore");
86 SolrQuery query = new SolrQuery();
87 //设置默认查询域
88 query.set("df", "product_name");
89 //设置查询条件
90 query.setQuery("家天下");
91 //设置过滤条件
92 query.set("fq", "product_catalog_name:幽默杂货");
93 //设置排序
94 query.setSort("product_price", ORDER.desc);
95 //分页
96 query.setStart(0);
97 query.setRows(20);
98 //结果中要包含的域
99 query.setFields("id","product_name","product_price","product_catalog_name");
100 //打开高亮显示
101 query.setHighlight(true);
102 //设置高亮显示的域
103 query.addHighlightField("product_name");
104 //设置高亮的前缀和后缀
105 query.setHighlightSimplePre("<span style='color:red'>");
106 query.setHighlightSimplePost("</span>");
107 QueryResponse queryResponse = solrServer.query(query);
108 SolrDocumentList documentList = queryResponse.getResults();
109 System.out.println("共有"+documentList.getNumFound()+"条记录");
110 for (SolrDocument solrDocument : documentList) {
111 System.out.println("商品id "+solrDocument.get("id"));
112 System.out.println("商品名称 "+solrDocument.get("product_name"));
113 System.out.println("商品价格 "+solrDocument.get("product_price"));
114 System.out.println("商品分类 "+solrDocument.get("product_catalog_name"));
115 Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
116 List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
117 if(list!=null) {
118 System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++");
119 System.out.println(list);
120 }
121 System.out.println("-----------------------------------------------------------");
122 }
123 }
124 }
demo