1. 程式人生 > >solr的安裝與solrJ的使用-java版

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格式的資料。