Solr的配置和在java中的使用


Solr是一個全局站內搜索引擎,可以快速的搜索出結果。

Solr依賴於tomcat,把Solr的war包放到tomcat中即可運行。

  • 使用solr,需要在solr的schema.xml中配置solr與java的映射關系,便於存放數據,在schema.xml中配置如下關系。

      <fieldType name="text_ik" class="solr.TextField">
        <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
      </fieldType>
      
      <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"/>
    

Solr與Spring的集成

  • 添加支持solr客戶端的依賴

      <!-- solr客戶端 -->
      <dependency>
      	<groupId>org.apache.solr</groupId>
      	<artifactId>solr-solrj</artifactId>
      	<version>4.10.3</version>
      </dependency>
    
  • 在Spring中配置Solr的bean

      <bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
      	<constructor-arg name="baseURL" value="http://47.95.196.183:8080/solr/"></constructor-arg>
      </bean>
    
  • 向solr中添加數據,先從數據庫中查詢出所有有用信息,然后放到solr中

      //導入solrServer對象
      @Autowired
      private SolrServer solrServer;
    
      //查詢商品列表
      List<SolrItem> list = itemMapper.getItemList();
      //向索引庫中添加文檔
      for (SolrItem solrItem : list) {
      	//創建文檔對象
      	SolrInputDocument document = new SolrInputDocument();
      	document.setField("id", solrItem.getId());
      	document.setField("item_title", solrItem.getTitle());
      	document.setField("item_sell_point", solrItem.getSell_point());
      	document.setField("item_price", solrItem.getPrice());
      	document.setField("item_image", solrItem.getImage());
      	document.setField("item_category_name", solrItem.getItem_cat_name());
      	document.setField("item_desc", solrItem.getItem_desc());
      	//向索引庫中添加文檔
      	solrServer.add(document);
      }
      //提交修改
      solrServer.commit();
    

這樣,數據就全部添加到Solr中了。

  • 從Solr中查詢數據

      @Autowired
      private SolrServer solrServer;//導入solrServer對象
    
      //創建查詢對象
      SolrQuery solrQuery = new SolrQuery();
      //設置查詢條件
      //solrQuery.set("q","");
      solrQuery.setQuery(queryString);
      //設置分頁
      solrQuery.setStart((int) ((page - 1) * pageSize));
      solrQuery.setRows(pageSize.intValue());
      //高亮設置
      solrQuery.setHighlight(true);
      //設置高亮顯示的域
      solrQuery.addHighlightField("item_title");
      //高亮顯示的前綴
      solrQuery.setHighlightSimplePre("<span style='color:red'>");
      //高亮顯示的后綴
      solrQuery.setHighlightSimplePost("</span>");
      //設置默認搜區域
      solrQuery.set("df", "item_keywords");
    
      //根據查詢條件查詢索引庫
      QueryResponse response = solrServer.query(solrQuery);
      //從response中取查詢結果
      SolrDocumentList list = response.getResults();
      //查詢結果list
      List<SolrItem> itemList = new ArrayList<>();
      //遍歷查詢結果
      for (SolrDocument solrDocument : list) {
      	//創建一商品對象
      	SolrItem item = new SolrItem();
      	item.setId(Long.parseLong((String)solrDocument.get("id")));
      	//取高亮顯示
      	Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
      	List<String> hList = highlighting.get(solrDocument.get("id")).get("item_title");
      	String title = "";
      	//判斷是否有高亮信息
      	if (hList != null && hList.size() > 0) {
      		title = hList.get(0);
      	} else {
      		title = (String) solrDocument.get("item_title");
      	}
      	item.setTitle(title);
      	item.setSell_point((String) solrDocument.get("item_sell_point"));
      	item.setPrice((long) solrDocument.get("item_price"));
      	item.setImage((String) solrDocument.get("item_image"));
      	//添加到商品列表
      	itemList.add(item);
      }
    

最后,將查詢的結果放入到itemList中返回。


  • 報錯信息:在solr中提示沒有item_title字段,后發現是在第一步中配置的映射關系沒有生效,仔細檢查發現是在創建classes文件夾的時候寫成了calsses導致配置沒有生效。。重新配置生效即可添加數據並調用接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM