solr的安裝與solrJ的使用-java版
solrJ的使用
Solr是一個全文檢索伺服器,只需要進行配置就可以實現全文檢索服務。
1、solr的安裝及配置
需要把solr伺服器安裝到linux環境:
第一步:安裝linux、jdk、tomcat。
jdk的安裝:上傳jdk的壓縮包到linux上
解壓jdk
配置環境變數的配置檔案 vim /etc/prifile
新增三個屬性 JAVA_HOME=/jdk目錄
PATH=/jdk目錄/bin:$PATH
export JAVA_HOME PATH
登出後即可生效
tomcat的安裝: 上傳tomcat壓縮包到linux上
解壓tomcat即可
第二步:把solr的壓縮包上傳到伺服器。並解壓。
第三步:把/../solr-4.10.3/dist/solr-4.10.3.war包部署到tomcat下( cp solr-4.10.3.war /.../tomcat/webapps/solr.war)。並改名為solr.war (這個就是solr工程的war包)
第四步:解壓war包(啟動tomcat自動解壓)。關閉tomcat。刪除solr.war.
第五步:把/../solr-4.10.3/example/lib/ext 目錄下所有的jar包複製到solr工程中(cp * /.../tomcat/webapps/solr/WEB-INF/lib/)。
第六步:建立solrhome。Solrhome是存放solr伺服器所有配置檔案的目錄(把/.../solr-xxx/example下的solr目錄 考到 solrhome目錄下 )。
第七步:告訴solr伺服器solrhome的位置。需要修改solr工程的web.xml檔案。
第八步:啟動tomcat 在瀏覽器中訪問 linuxIP:8080/solr
2、配置 中文解析器、業務欄位
在 solrhome/collection1/conf/schema.xml 中配置中文解析器
①、在solr中預設是中文分析器,需要手工配置。配置一個FieldType,在FieldType中指定中文分析器;Solr中的欄位必須是先定義後使用。
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
②、業務欄位判斷標準:1、在搜尋時是否需要在此欄位上進行搜尋。例如:商品名稱、商品的賣點、商品的描述 2、後續的業務是否需要用到此欄位。例如:商品id。
在 solrhome/collection1/conf/schema.xml 中配置業務欄位
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="long" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category_name" type="string" indexed="true" stored="true" />
<field name="item_desc" type="text_ik" indexed="true" stored="false" />
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_sell_point" dest="item_keywords"/>
<copyField source="item_category_name" dest="item_keywords"/>
<copyField source="item_desc" dest="item_keywords"/>
重啟tomcat;
3、solrJ客戶端
需要依賴solrj的jar包。
<!-- solr客戶端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>
solrJ的使用
public class SolrJTest {
//新增索引
@Test
public void addDocument() throws Exception {
//建立一個連線
SolrServer solrServer = new HttpSolrServer("http://linuxIP:8080/solr");
//建立一個solr的文件物件
SolrInputDocument document = new SolrInputDocument();
document.addField("id", "test001"); //第一個是key(需要和solr配置的欄位一樣),第二個是value
document.addField("item_title", "測試商品2");
document.addField("item_price", 54321);
//把文件物件寫入索引庫
solrServer.add(document);
//提交
solrServer.commit();
}
//刪除索引
@Test
public void deleteDocument() throws Exception {
//建立一連線
SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
//solrServer.deleteById("test001");
solrServer.deleteByQuery("*:*"); //刪除所有
solrServer.commit();
}
//查詢索引
@Test
public void queryDocument() throws Exception {
SolrServer solrServer = new HttpSolrServer(
"http://192.168.253.181:8080/solr");
// 建立一個查詢物件
SolrQuery query = new SolrQuery();
// 設定查詢條件
query.setQuery("*:*");
query.setStart(20);
query.setRows(50);
// 執行查詢
QueryResponse response = solrServer.query(query);
// 取查詢結果
SolrDocumentList solrDocumentList = response.getResults();
System.out.println("共查詢到記錄:" + solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("item_title"));
System.out.println(solrDocument.get("item_price"));
System.out.println(solrDocument.get("item_image"));
}
}
}
釋出一個solr的搜尋服務: 建立一搜素的服務工程
1、使用java程式讀取mysql資料庫中的商品資訊,然後建立solr文件物件,把商品資訊寫入索引庫(在solr服務上寫匯入的java程式碼)。
@Override
public TaotaoResult importAllItems() {
try {
//查詢商品列表
List<Item> list = itemMapper.getItemList();
//把商品資訊寫入索引庫
for (Item item : list) {
//建立一個SolrInputDocument物件
SolrInputDocument document = new SolrInputDocument();
document.setField("id", item.getId());
document.setField("item_title", item.getTitle());
document.setField("item_sell_point", item.getSell_point());
document.setField("item_price", item.getPrice());
document.setField("item_image", item.getImage());
document.setField("item_category_name", item.getCategory_name());
document.setField("item_desc", item.getItem_des());
//寫入索引庫
solrServer.add(document);
}
//提交修改
solrServer.commit();
} catch (Exception e) {
e.printStackTrace();
return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
}
return TaotaoResult.ok();
}
4、搜尋服務的釋出
http形式的服務。對外提供搜尋服務是一個get形式的服務。呼叫此服務時需要查詢條件
,分頁條件可以使用page(要顯示第幾頁)、rows(每頁顯示的記錄數)。返回一個json格式的資料。可以使用TaotaoResult包裝一個商品列表轉換成json。
dao層
@Override
public SearchResult search(SolrQuery query) throws Exception {
// 返回值物件
SearchResult result = new SearchResult(); //記錄商品列表、總記錄、總頁、當前頁
// 根據查詢條件query查詢索引庫
QueryResponse queryResponse = solrServer.query(query);
// 取查詢結果
SolrDocumentList solrDocumentList = queryResponse.getResults();
// 取查詢結果總數量
result.setRecordCount(solrDocumentList.getNumFound());
// 商品列表
List<Item> itemList = new ArrayList<>();
// 取高亮顯示
Map<String, Map<String, List<String>>> highlighting = queryResponse
.getHighlighting();
// 取商品列表
for (SolrDocument solrDocument : solrDocumentList) {
// 建立一商品物件
Item item = new Item();
item.setId((String) solrDocument.get("id"));
// 取高亮顯示的結果
List<String> list = highlighting.get(solrDocument.get("id")).get(
"item_title");
String title = "";
if (list != null && list.size() > 0) {
title = list.get(0);
} else {
title = (String) solrDocument.get("item_title");
}
item.setTitle(title);
item.setImage((String) solrDocument.get("item_image"));
item.setPrice((long) solrDocument.get("item_price"));
item.setSell_point((String) solrDocument.get("item_sell_point"));
item.setCategory_name((String) solrDocument
.get("item_category_name"));
// 新增的商品列表
itemList.add(item);
}
result.setItemList(itemList);
return result;
}
service層
@Override
public SearchResult search(String queryString, int page, int rows)
throws Exception {
// 建立查詢物件 solrJ定製版物件
SolrQuery query = new SolrQuery();
// 設定查詢條件
query.setQuery(queryString);
// 設定分頁
query.setStart((page - 1) * rows);
query.setRows(rows);
// 設定預設搜素域
query.set("df", "item_keywords");
// 設定高亮顯示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
// 執行查詢
SearchResult searchResult = searchDao.search(query);
// 計算查詢結果總頁數
long recordCount = searchResult.getRecordCount();
long pageCount = recordCount / rows;
if (recordCount % rows > 0) {
pageCount++;
}
searchResult.setPageCount(pageCount);
searchResult.setCurPage(page);
return searchResult;
}
controller層
接收查詢引數:查詢條件、page、rows呼叫Service執行查詢返回一個查詢結果物件。 把查詢結果包裝到Result中返回,結果是json格式的資料。