什么是solr?
Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
solr整合Tomcat步骤
第一步:安装tomcat。D: empapache-tomcat-7.0.53
第二步:把solr的war包复制到tomcat 的webapp目录下。
把solr-4.10.3distsolr-4.10.3.war复制到D: empapache-tomcat-7.0.53webapps下。
改名为solr.war
第三步:solr.war解压。使用压缩工具解压或者启动tomcat自动解压。解压之后删除solr.war
第四步:把solr-4.10.3examplelibext目录下的所有的jar包添加到solr工程中
第五步:配置solrHome和solrCore。
1)创建一个solrhome(存放solr所有配置文件的一个文件夹)。solr-4.10.3examplesolr目录就是一个标准的solrhome。
2)把solr-4.10.3examplesolr文件夹复制到D: emp 108路径下,改名为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(collection1lib)中
solr-4.10.3dist
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,保存到collection1conf目录下
<?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.3distsolrj-lib
下全部jar包共8个
solr-4.10.3dist
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 }