sorl是基于luncene开发的一个框架,具体就不多解释了,主要是说一下怎么实现
首先简单说一下内容吧!
<env-entry>
<env-entry-name>solr/homeenv-entry-name>
<env-entry-value>C:\temp\solrhomeenv-entry-value>
<env-entry-type>java.lang.Stringenv-entry-type>
env-entry>
新建一个Sorlcore:只要复制collection1,再重命名粘贴到同一目录下就可以了,比如重命名为collection2,并且还要修改collection2\core.properties文件内容为 name=collection2
这时启动tomcat访问http://localhost:8080/solr/就可以访问solr后台管理界面了。
说在前面:因为我们通常都是在处理中文文件,所以一般都是需要用到中文分析器的,这里推荐使用IK分析器,下面简单说一下配置IK分析器的步骤。
首先把IK分析器的jar包丢到tomcat里面的solr工程里,同时也复制IK分析器的配置文件和自定义词典和停用词词典到solr的classpath下,然后在solrhome里面找到collection1\conf\schema.xml文件,在该文件的后面 标签之前,添加以下代码:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
fieldType>
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
在sorl里面field的名字是不可以随便取的,要符合schema.xml配置文件的要求,这里就不多说这方面的事情了。
在Core selector那里找到collection1,选中他就可以进入下面的操作了,主要说三个操作Document,query和Dataimport
创建和更新建议使用json,删除则用xml
1.创建索引的格式:
就直接按json的格式就可以了,例如{“id”:”123456”,”title_ik”:”测试标题”}。
2.更新索引的格式:
更新类似添加,其实就是先删除再添加,如果id存在就是更新,不存在就是添加。
3.删除索引的格式如下:
a.删除制定ID的索引
<delete>
<id>1id>
delete>
<commit/>
b.删除查询到的索引数据
<delete>
<query>product_catalog_name:衣服query>
delete>
<commit/>
c.删除所有索引数据
<delete>
<query>*:*query>
delete>
<commit/>
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xmlstr>
lst>
requestHandler>
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solrData"
user="root"
password="root"/>
<document>
<entity name="product" query="SELECT p_id,p_name,p_catalog_name,p_price,p_description,p_picture FROM products ">
<field column="p_id" name="id"/>
<field column="p_name" name="product_name"/>
<field column="p_catalog_name" name="product_catalog_name"/>
<field column="p_price" name="product_price"/>
<field column="p_description" name="product_description"/>
<field column="p_picture" name="product_picture"/>
entity>
document>
5.这时候就可以导入mysql里面的数据了吗?还不行,还要为上面的业务系统自定义相关的field,也就是还需要在schema.xml配置文件中加入下面代码:
<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"/>
到这里就差不多了,确实配置挺多东西的。
*:*
。product_price:[1 TO 15]
+[,+]…
。示例:product_price desc
solrj是访问Solr服务的java客户端,提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务。
基本步骤:
1. 依赖的jar包:solr-4.10.3\dist\
路径下的solr-solrj-4.10.3.jar和solrj-lib文件夹里面的所有jar包。
2. 需要的jar包: solr-4.10.3\example\lib\ext\
路径下所有的jar包也需要。
3. 和Solr服务器建立连接。HttpSolrServer对象建立连接。
4. 创建一个SolrInputDocument对象,然后添加域。
5. 将SolrInputDocument添加到索引库。
6. 提交。
实现这些操作的代码:
//通过sorlj插入一个文档
@Test
public void addDocument() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个文档对象
SolrInputDocument document=new SolrInputDocument();
//3.向文档中添加域
document.addField("id", "c5luo45678");
document.addField("title_ik", "使用solrj添加的文档");
document.addField("content_ik", "这就是它的那些无聊的内容,无聊透顶了,没什么好看的。");
document.addField("product_name", "这是一个商品名称");
//4.把document对象添加到索引库
solrServer.add(document);
//5.提交修改
solrServer.commit();
}
//根据id删除文档
@Test
public void deleteDocumentById() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
solrServer.deleteById("c5luo45678");
solrServer.commit();
}
//根据条件删除
@Test
public void deleteDocumentByQuery() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
//修改文档
//solrj里面的修改文档使用的是添加文档的方法,只要id存在就是修改(删除存在的,添加新的),不存在就添加
@Test
public void updateDocument() throws SolrServerException, IOException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个文档对象
SolrInputDocument document=new SolrInputDocument();
//3.向文档中添加域
document.addField("id", "c5luo45678");
document.addField("title_ik", "我已经不是当初的我了");
document.addField("content_ik", "我还是那么的无聊");
document.addField("product_name", "换了个无聊的名字");
//4.把document对象添加到索引库
solrServer.add(document);
//5.提交修改
solrServer.commit();
}
大概步骤:
//先来个简单查询
@Test
public void testQueryIndex() throws SolrServerException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个query对象
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.setQuery("*:*");
//4.执行查询
QueryResponse queryResponse = solrServer.query(query);
//5.取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
//6.输出查询到的商品总数目
System.out.println("一共查询到的商品数量为:"+solrDocumentList.getNumFound());
//7.遍历查询结果
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("product_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_picture"));
}
}
//来个复杂查询,包含查询、过滤、分页、排序、高亮显示等处理
@Test
public void testQueryIndex2() throws SolrServerException{
//1.和solr服务器连接,建立一个SolrServer对象,传一个solr服务器地址进去作为参数
SolrServer solrServer=new HttpSolrServer("http://localhost:8080/solr");
//2.创建一个query对象
SolrQuery query = new SolrQuery();
//3.设置查询条件
query.setQuery("台灯");
//4.设置过滤条件
query.setFilterQueries("product_price:[10 TO 200]");
//5.设置排序规则
query.setSort("product_price", ORDER.asc);
//6.分页处理
query.setStart(0);
query.setRows(20);
//7.设置结果需要包含的域
query.setFields("id","product_name","product_price");
//8.设置默认搜索域
query.set("df", "product_keywords");
//9.高亮显示搜索的关键词,只是product_name
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
//*****************************************************
//10.执行查询
QueryResponse queryResponse = solrServer.query(query);
//11.获取结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
System.out.println("结果的数量:"+solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
String id = (String)solrDocument.get("id");
System.out.println(id);
//获取高亮内容
String product_name="";
Map>> highlighting = queryResponse.getHighlighting();
List list = highlighting.get(id).get("product_name");
//判断是否有高亮内容,因为默认查询的域是product_keywords,所以有可能关键字不一定在product_name里面,所以就会有些没有高亮
if(list!=null){
product_name=list.get(0);
}else{
product_name=(String) solrDocument.get("product_name");
}
System.out.println(product_name);
System.out.println(solrDocument.get("product_price"));
System.out.println("-------------------------------------------");
}
}