zoukankan      html  css  js  c++  java
  • 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导致配置没有生效。。重新配置生效即可添加数据并调用接口。
  • 相关阅读:
    由 Rest参数 和 Spread扩展运算符想到的...
    输出数组重复项
    echarts 踩坑记
    es6 Promise.all() 和 Promise.race() 区别
    关于Promise.all
    移动端弹出层平滑滚动和fix定位的冲突
    ES6 数组和字符串
    IE9以下 placeholder兼容
    jQuery设置聚焦并使光标位置在文字最后
    处理GitHub不允许上传大于100M文件问题
  • 原文地址:https://www.cnblogs.com/esileme/p/7833690.html
Copyright © 2011-2022 走看看