Solr-项目中的使用

配置中文分析器

在SolrCore的conf下的schema.xml是Solr数据表配置文件,定义了加入索引的数据的数据类型。
主要包括Fields,FieldTypes和其他的一些设置。
	<!-- IKAnalyzer-->
    <fieldType name="text_ik" class="solr.TextField">
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
    </fieldType>

	<!--IKAnalyzer Field-->
   <field name="title_ik" type="text_ik" indexed="true" stored="true" />
   <field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>

   <!--product-->
   <field name="product_name" type="text_ik" indexed="true" stored="true"/>
   <field name="product_price"  type="float" indexed="true" stored="true"/>
   <field name="product_description" type="text_ik" indexed="true" stored="false" />
   <field name="product_picture" type="string" indexed="false" stored="true" />
   <field name="product_catalog_name" type="string" indexed="true" stored="true" />

   <field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
   <copyField source="product_name" dest="product_keywords"/>
   <copyField source="product_description" dest="product_keywords"/>
FieldType:定义字段的类型
Field:定义字段,type分析类型,indexed是否索引,stored是否存储。
uniqueKey:Solr默认定义唯一主键key为id域。
copyField:复制域,将多个Field复制到一个Field中,以便于统一的检索。

以上 为实例业务系统的Field。

批量导入数据

使用dataimport:
1、位置2个jar在solr目录的dist目录下
2、将此2jar包,放入solrCore的lib扩展目录下,再加上数据库的驱动mysql
3、在SolrCore的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> 
4、SolrCore的conf下创建一个文件:data-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
		  driver="com.mysql.jdbc.Driver"   
		  url="jdbc:mysql://localhost:3306/lucene"   
		  user="root"   
		  password="root"/>   
<document>   
	<entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
		 <field column="pid" name="id"/> 
		 <field column="name" name="product_name"/> 
		 <field column="catalog_name" name="product_catalog_name"/> 
		 <field column="price" name="product_price"/> 
		 <field column="description" name="product_description"/> 
		 <field column="picture" name="product_picture"/> 
	</entity>   
</document>   

</dataConfig>
5、启动服务器,访问Solr服务器的core,进行对数据库索引导入。

导入数据前,会先清空索引库,然后再导入。


工程搭建:

导入jar:
1、springmvc的相关jar包
2、SolrJ的jar包和solrJ的依赖包
3、solr目录下example/lib/ext中的入职相关。

Web.xml:
POST乱码过滤器、前端控制器

SpringMVC.xml:
包扫描器、注解驱动、视图解析器,再加上:
		<bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
			<constructor-arg index="0" value="http://localhost:8080/solr/collection1"></constructor-arg>
		</bean>


Dao:
	private @Autowired SolrServer solrServer;

	public SearchResult search(SolrQuery query) throws Exception{
		SearchResult result = new SearchResult();
		// 查询结果
		QueryResponse response = solrServer.query(query);
		SolrDocumentList results = response.getResults();	// 结果集
		Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();//高亮结果集
		
		List<Product> list = new ArrayList<>();
		// 遍历查询结果
		for (SolrDocument doc : results) {
			Product pro = new Product();
			pro.setPid((String) doc.get("id"));
			
			String name = "";
			List<String> list2 = highlighting.get(doc.get("id")).get("product_name");
			if(list2 != null && list2.size() > 0){
				name = list2.get(0);
			}else{
				name = (String) doc.get("product_name");
			}
			
			pro.setName(name);
			pro.setCatalog_name((String) doc.get("product_catalog_name"));
			pro.setPicture((String) doc.get("product_picture"));
			pro.setPrice((float) doc.get("product_price"));
			list.add(pro);
		}
		
		result.setPruductList(list);	// 商品列表
		result.setTotalCount(results.getNumFound());	// 总记录数
		return result;
	}



Service:
	private @Autowired SearchDao searchDao;
	
	public SearchResult search(String queryString,String catalog_name,String price,Integer sort,Integer page) throws Exception {
		SolrQuery query = new SolrQuery();
		// 设置 主查询条件
		if(queryString != null && queryString != ""){
			query.setQuery(queryString);
		}else {
			query.setQuery("*:*");
		}
		//设置过滤条件
		if(catalog_name != null && catalog_name != ""){
			query.addFilterQuery("product_catalog_name:" + catalog_name);
		}
		// 价格区间
		if(price != null && price != ""){
			String[] split = price.split("-");
			query.addFilterQuery("product_price:["+split[0]+" TO "+split[1]+"]");
		}
		// 排序条件
		if(sort != null && sort == 1){
			query.setSort("product_price", ORDER.desc);
		}else {
			query.setSort("product_price", ORDER.asc);
		}
		// 分页
		if( page == null || page < 1) {
			page = 1;
		}
		// 起始	固定每页10条
		int start = (page -1 ) * 10;
		query.setStart(start);
		query.setRows(10);
		// 设置 默认搜索域
		query.set("df", "product_keywords");
		// 高亮显示
		query.setHighlight(true);
		query.addHighlightField("product_name");
		query.setHighlightSimplePre("<em style='color:red'>");
		query.setHighlightSimplePost("</em>");
		
		// 查询 商品列表
		SearchResult result = searchDao.search(query);
		
		Long totalCount = result.getTotalCount();
		int page1 = (int) (totalCount/query.getRows());
		if(totalCount % query.getRows() > 0){ page1 ++; }
		
		result.setPageCount(page1);
		result.setPagesize(query.getRows());
		
		return result;
	}



Controller:
	private @Autowired SearchService searchService;
	
	@RequestMapping("search")
	public String search(String queryString,String catalog_name,String price,Integer sort,@RequestParam(defaultValue="1")Integer page,Model model) throws Exception {
		
		SearchResult result = searchService.search(queryString, catalog_name, price, sort, page);
		// 
		model.addAttribute("result", result);
		// 
		model.addAttribute("queryString", queryString);
		model.addAttribute("catalog_name", catalog_name);
		model.addAttribute("price", price);
		model.addAttribute("sort", sort);
		if(page < 1 ){
			page = 1;
		}
		model.addAttribute("page", page);
		
		return "product_list";
	}




以上是对Solr服务器的简单使用……
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值