solr學習之旅

solr是全文檢索企業級框架。

solr下載地址:http://archive.apache.org/dist/lucene/solr/

使用環境:JDK1.7以上、Tomcat 7以上

搭建solr服務器環境--window版

一、搭建solr服務器

1、創建“solr”文件夾 --- solr服務器目錄。

2、把Tomcat和solr 4.10.3版本包放到solr服務器目錄中。


3、到solr-4.10.3\example\webapps目錄下找到solr.war包,複製到tomcat的webapps下並解壓。因解壓後的solr項目要修改,所有要刪除war包,否則啓動tomcat後,會覆蓋原有的solr項目。


4、到solr-4.10.3\example\lib\ext目錄下找到solr依賴包,複製到solr項目下WEB-INF的lib文件夾中。



5、在solr目錄下創建solrHome文件夾 --- solr索引庫(家)。把solr-4.10.3\example\solr目錄下全部文件複製到solrHome中。




6、修改solr項目下WEB-INF的web.xml配置文件。把註釋去掉,並指定solrHome(家)的路徑,如下圖:



7、啓動tomcat,訪問solr服務。

可能出現的問題,如果JDK環境不是1.7以上,啓動tomcat會報錯,錯誤如下;

JSR 356 WebSocket (Java WebSocket 1.1) support is not available when running on Java 6. To suppress this message, run Tomcat on Java 7, remove the WebSocket JARs from $CATALINA_HOME/lib or add the WebSocket JARs to the tomcat.util.scan.DefaultJarScanner.jarsToSkip property in $CATALINA_BASE/conf/catalina.properties. Note that the deprecated Tomcat 7 WebSocket API will be available. 

訪問solr後臺管理頁面:http://localhost:8080/solr


solr服務器搭建完成。

如果想在同一個solr服務中建立多庫,可以把solrHome中collection1複製多份。比如兩個庫,複製後把文件夾名改成collection2,打開collection2的core.properties文件,修改name的值爲collection2,重啓tomcat服務。







二、配置IK中文分析器

1、下載IK中文分詞器,IK中文分詞器的更新版本只到2012年,所以IK中文分詞器只支持solr 5之前的版本,solr6或以上的版本,中文分詞器都不生效。除非到網上下載非官方的版本包。


2、把IK中文分析器的jar包複製到solr項目的WEB-INF\lib目錄下。

3、把IKAnalyzer.cfg.xml和stopword.dic文件複製到solr項目的WEB-INF\classes目錄下(創建classes文件夾)。

4、修改IKAnalyzer.cfg.xml文件,去除擴展字典的註釋。


5、創建ext.dic文件,文件名稱就是IKAnalyzer.cfg.xml中擴展字典裏指定的名稱。


6、擴展詞彙和禁用詞彙,ext.dic文件中填寫的是擴展詞彙,想進行分詞的詞語都可以寫在文件中。stopword.dic文件中填寫的是禁用詞彙,不想進行分詞的詞語都可以寫在這個文件中。

注意:修改文件stopword.dic,ext.dic的編碼方式一定要是UTF-8無BOM的編碼方式,不然分詞器會失效,可以使用notepad++工具編譯。

               

7、到solrHome\collection1\conf目錄下的schema.xml文件中添加如下配置;

<fieldType name="text_ik" class="solr.TextField" >
  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>

<field name="name_ik" type="text_ik" indexed="true" stored="true" />

8、驗證IK中文分詞器,“我”和“是”都是禁用詞彙,分詞中不會顯示。“高富帥”是擴展詞彙,會分詞。


配置IK中文分詞器完成。


三、數據庫中數據導入solr索引庫

1、導入jar包,solr-4.10.3\dist目錄下找到solr-dataimporthandler-4.10.3.jar和solr-dataimporthandler-extras-4.10.3.jar複製到solrHome\collection1\lib目錄下(創建lib文件夾),再把數據庫驅動包複製到該目錄下。


2、到solrHome\collection1\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>

3、到solrconfig.xml同目錄下創建data-config.xml配置文件,在文件中添加如下配置;

<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource type="JdbcDataSource"
			driver="com.mysql.jdbc.Driver"
			url="jdbc:mysql://localhost:3306/solr"
			user="root"
			password="123456" />
<document>
	<entity name="product" query="select * from product">
		<!--column爲數據庫字段名,name爲solr索引庫域名-->
		<field column="pid" name="id" />
		<field column="name" name="p_name" />
		<field column="price" name="p_price" />
		<field column="type" name="p_type" />
		<field column="context" name="p_context" />
		<field column="pic" name="p_pic" />
	</entity>
</document>
</dataConfig>

4、在同目錄下的schema.xml配置文件中給solr索引庫新增域名,如下配置;

<!--id字段默認就有,不需要再配置。但注意id字段要配置required="true" ,表示增加索引時必須要給id值-->
<!--域名不能是關鍵字,比如name="name"-->
<field name="p_name" type="text_ik" indexed="true" stored="true" />
<field name="p_price" type="int" indexed="true" stored="true" />
<field name="p_type" type="string" indexed="true" stored="true" />
<field name="p_context" type="text_ik" indexed="true" stored="true" />
<field name="p_pic" type="string" indexed="true" stored="true" />

<!--多域字段要配置multiValued="true"-->
<field name="product_all" type="text_ik" indexed="true" stored="false" multiValued="true"/>

<copyField source="p_name" dest="product_all"/>
<copyField source="p_context" dest="product_all"/>

5、批量導入數據庫數據到solr索引庫


批量導入數據到solr索引庫完成。


四、測試項目

solr客戶端項目環境也要是JDK1.7以上、tomcat7以上

1、在spring或springmvc配置文件中配置solrJ,交給spring容器管理。

<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
	<!-- 構造器傳參,把solr服務地址傳進來 -->
	<constructor-arg value="http://localhost:8080/solr"></constructor-arg>
</bean>

    也可以不用在配置文件中配置,直接在程序中創建對象

String baseURL = "http://localhost:8080/solr";
SolrServer server = new HttpSolrServer(baseURL);

2、測試類

package com.jd.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.jd.bean.Product;

@Repository
public class JDDao {
	
	@Autowired
	private SolrServer solrServer;

	/**
	 * 新增
	 */
	public void testAdd() throws Exception{
		
//		String baseURL = "http://localhost:8080/solr";
//		SolrServer server = new HttpSolrServer(baseURL);
		
		SolrInputDocument doc = new SolrInputDocument();
		doc.addField("id", "lala");
		doc.addField("name", "wangwei");
		solrServer.add(doc, 1000);
		
	}
	
	/**
	 * 刪除
	 */
	public void testDel() throws Exception{
//		String baseURL = "http://localhost:8080/solr";
//		SolrServer server = new HttpSolrServer(baseURL);
		
		solrServer.deleteByQuery("id:lala", 1000);
	}
	
	/**
	 * 查詢
	 */
	public List<Product> getQuery(String pName, String pPrice, String pContext, String pType) throws Exception{
//		String baseURL = "http://localhost:8080/solr";
//		SolrServer server = new HttpSolrServer(baseURL);
		
		SolrQuery solrQuery = new SolrQuery();
		//關鍵字
		if(pName == null || "".equals(pName.trim())){
			pName = "*";
		}
		solrQuery.setQuery(pName);
		
		StringBuffer sb = new StringBuffer();
		//過濾條件(商品內容、商品類型、商品價格)
		if(pContext != null && !"".equals(pContext.trim())){
			sb.append("p_context:" + pContext).append(",");
		}
		if(pType != null && !"".equals(pType.trim())){
			sb.append("p_type:" + pType).append(",");
		}
		if(pPrice != null && !"".equals(pPrice.trim())){
			String[] split = pPrice.split("-");
			sb.append("p_price:[" + split[0] + " TO " + split[1] + "]");
		}
		//過濾條件要放到數組中,solrQuery.setFilterQueries才能處理
		if(!"".equals(sb.toString())){
			String[] fqs = sb.toString().split(",");
			solrQuery.setFilterQueries(fqs);
		}
		//價格排序
		solrQuery.setSort("p_price", ORDER.desc);
		//分頁
		solrQuery.setStart(0);
		solrQuery.setRows(16);
		//默認域,註釋標識查詢所有域
//		solrQuery.setFields("id,p_name,p_price,p_type,p_context");
		//默認查詢指定域
		solrQuery.set("df", "p_name");
		//高亮
		//打開高亮
		solrQuery.setHighlight(true);
		//指定要高亮的域
		solrQuery.addHighlightField("p_name");
		solrQuery.addHighlightField("p_context");
		//指定添加的樣式 前綴
		solrQuery.setHighlightSimplePre("<span style='color:red'>");
		//後綴
		solrQuery.setHighlightSimplePost("</span>");
		//執行查詢
		QueryResponse response = solrServer.query(solrQuery);
		//查詢結果集
		SolrDocumentList results = response.getResults();
		//查詢高亮結果集
		Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
		
		List<Product> products = new ArrayList<Product>();
		
		for (SolrDocument solrDocument : results) {
			
			Product product = new Product();
			product.setId(solrDocument.get("id") + "");
			product.setpName(solrDocument.get("p_name") + "");
			product.setpPrice(solrDocument.get("p_price") + "");
			product.setpType(solrDocument.get("p_type") + "");
			product.setpPic(solrDocument.get("p_pic") + "");
			
			//商品內容p_context要用高亮方式在頁面上顯示,所以在存p_context時,直接到高亮結果集中獲取。
			Map<String, List<String>> map = highlighting.get(solrDocument.get("id"));
			List<String> list = map.get("p_context");
			product.setpContext(list.get(0));
			
			products.add(product);
			
		}
		
		return products;
	}
	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章