精华内容
下载资源
问答
  • solr

    2021-01-06 22:11:59
    Solr是一个独立的企业级搜索应用服务器,它对外提供Web-service的ApI接口接口,用户可以通过http请求,想搜索引擎提交一定格式的XML文件,生成索引,也可以通过Http Get操作提出查找请求,得到Xml格式的返回结果. ...
  • WEB项目中搜索功能是必不可少的,然而如果我们每次搜索都去数据库查询,将极大浪费性能,因此,我们需要一个全文搜索服务器——Solr。本博文将详细介绍Solr服务的搭建搜索功能的实现。 一、Solr 1.Solr简介 Solr 是...

    概述

    WEB项目中搜索功能是必不可少的,然而如果我们每次搜索都去数据库查询,将极大浪费性能,因此,我们需要一个全文搜索服务器——Solr。本博文将详细介绍Solr服务的搭建搜索功能的实现。

    一、Solr

    1.Solr简介

    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

    Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删除、更新索引 。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。

    简单来说,就是Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。

    2.Solr的安装及配置

    详细安装过程及配置参照另一篇博客《Linux下Solr的安装及配置(CentOS为例)》

    3.Solr界面功能

    img

    img

    img

    img

    img

    4.维护索引库

    添加:添加一个json格式的文件就可以。

    修改:在solr中没有update,只需要添加一个新的文档,要求文档id和被修改文档的id一致。原理是先删除后添加。

    删除:使用xml格式。

    img

    删除两种方法:

    1、根据id删除:

    <delete>
    
    <id>test001</id>
    
    </delete>
    
    <commit/>
    

    2、根据查询删除:

    <delete>
    
    <query>*:*</query>
    
    </delete>
    
    <commit/>
    

    5.SolrJ客户端

    SolrJ是一个使Java应用程序可以轻松与Solr对话的API。SolrJ隐藏了许多连接到Solr的细节,并允许您的应用程序通过简单的高级方法与Solr进行交互。

    maven工程需要依赖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://192.168.10.130:8080/solr");
    		//创建一个文档对象
    		SolrInputDocument document = new SolrInputDocument();
    		document.addField("id", "test001");
    		document.addField("item_title", "测试视频");
    		document.addField("item_price", 53156);
    		//把文档对象写入索引库
    		solrServer.add(document);
    		//提交
    		solrServer.commit();
    	}
    	
    	@Test
    	public void deleteDocument() throws Exception{
    		SolrServer solrServer = new HttpSolrServer("http://192.168.10.130:8080/solr");
    		//solrServer.deleteById("test001");
    		solrServer.deleteByQuery("*:*");//删除所有
    		solrServer.commit();
    	}
    	
    	@Test
    	public void queryDocument() throws Exception{
    		SolrServer solrServer = new HttpSolrServer("http://192.168.10.130:8080/solr");
    		//创建一个查询对象
    		SolrQuery query = new SolrQuery();
    		//设置查询条件
    		query.setQuery("*:*");
    		//设置分页参数
    		query.setStart(20);
    		query.setRows(20);
    		//执行查询
    		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"));
    		}
    	}
    }
    

    二、把商品信息导入到索引库

    使用java程序读取mysql数据库中的商品信息,然后创建solr文档对象,把商品信息写入索引库。

    需要发布一个服务。 为了灵活的进行分布式部署需要创建一搜素的服务工程发布 搜素服务。Taotao-search。

    1.系统架构

    img

    2.创建taotao-search工程

    img

    配置:

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <parent>
        <groupId>com.taotao</groupId>
        <artifactId>taotao-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </parent>
      <groupId>com.taotao</groupId>
      <artifactId>taotao-serach</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
      <dependencies>
    		<dependency>
    			<groupId>com.taotao</groupId>
    			<artifactId>taotao-manager-mapper</artifactId>
    			<version>0.0.1-SNAPSHOT</version>
    		</dependency>
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-beans</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-aspects</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>servlet-api</artifactId>
    			<scope>provided</scope>
    		</dependency>
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>jsp-api</artifactId>
    			<scope>provided</scope>
    		</dependency>
    		<!-- solr客户端 -->
    		<dependency>
    			<groupId>org.apache.solr</groupId>
    			<artifactId>solr-solrj</artifactId>
    		</dependency>
    	</dependencies>
    	<build>
    		<!-- 配置插件 -->
    		<plugins>
    			<plugin>
    				<groupId>org.apache.tomcat.maven</groupId>
    				<artifactId>tomcat7-maven-plugin</artifactId>
    				<configuration>
    					<port>8084</port>
    					<path>/</path>
    				</configuration>
    			</plugin>
    		</plugins>
    		<resources>
    			<resource>
    				<directory>src/main/java</directory>
    				<includes>
    					<include>**/*.properties</include>
    					<include>**/*.xml</include>
    				</includes>
    				<filtering>false</filtering>
    			</resource>
    			<resource>
    				<directory>src/main/resources</directory>
    				<includes>
    					<include>**/*.properties</include>
    					<include>**/*.xml</include>
    				</includes>
    				<filtering>false</filtering>
    			</resource>
    		</resources>
    		
    	</build>
      
    </project>
    

    其他配置参考《企业WEB项目前台工程搭建,ajax跨域的解决》 taotao-rest工程的配置,基本差不多

    3.sql语句

    SELECT
    	a.id,
    	a.title,
    	a.sell_point,
    	a.price,
    	a.image,
    	b.`name` category_name,
    	c.item_desc
    FROM
    	tb_item a
    LEFT JOIN tb_item_cat b ON a.cid = b.id
    LEFT JOIN tb_item_desc c ON a.id = c.item_id
    

    创建一个sql语句对应的pojo。

    public class Item {
    
    	private String id;
    	private String title;
    	private String sell_point;
    	private long price;
    	private String image;
    	private String category_name;
    	private String item_des;
    }
    

    4.Dao层

    需要创建一个mapper接口+mapper映射文件。名称相同且在同一目录下。

    接口定义:

    img

    Mapper文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.taotao.search.mapper.ItemMapper" >
    	
    	<select id="getItemList" resultType="com.taotao.search.pojo.Item">
    		SELECT
    			a.id,
    			a.title,
    			a.sell_point,
    			a.price,
    			a.image,
    			b. NAME category_name
    		FROM
    			tb_item a
    		LEFT JOIN tb_item_cat b ON a.cid = b.id
    	</select>
    
    </mapper>
    

    5.Service层

    功能:导入所有的商品数据。没有参数。返回结果TaotaoResult。从数据库中查询出所有的商品数据。创建一个SolrInputDocument对象,把对象写入索引库。

    applicationContext-solr.xml

    <!-- 配置SolrServer对象 -->
    	<!-- 单机版 -->
    	<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
    		<constructor-arg name="baseURL" value="${SOLR.SERVER.URL}"></constructor-arg>
    	</bean>
    
    

    SOLR.SERVER.URL在properties中定义

    @Service
    public class ItemServiceImpl implements ItemService {
    
    	@Autowired
    	private ItemMapper itemMapper;
    	
    	@Autowired
    	private SolrServer solrServer;
    	
    	@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();
    	}
    
    }
    

    6.Controller层

    功能:发布一个rest形式的服务。调用Service的服务方法,把数据导入到索引库中,返回TaotaoResult。

    Url:/search/manager/importall

    @Controller
    @RequestMapping("/manager")
    public class ItemController {
    	
    	@Autowired
    	private ItemService itemService;
    
    	/**
    	 * 导入商品数据到索引库
    	 */
    	@RequestMapping("/importall")
    	@ResponseBody
    	public TaotaoResult importAllItems() {
    		TaotaoResult result = itemService.importAllItems();
    		return result;
    	}
    }
    

    三、实现商品搜索功能

    实现商品搜索功能需要两步实现:

    第一步:在taotoa-search工程中发布服务

    第二步:在taotao-portal中调用服务并展示结果。

    1.发布搜索服务

    1.1需求分析

    http形式的服务。对外提供搜索服务是一个get形式的服务。调用此服务时需要查询条件,分页条件可以使用page(要显示第几页)、rows(每页显示的记录数)。返回一个json格式的数据。可以使用TaotaoResult包装一个商品列表转换成json。

    请求的url:/search/query/{查询条件}/{page}/{rows}

    ​ /search/query?q={查询条件}&page={page}&rows={rows}

    返回的结果:TaotaoResult包装商品列表。

    返回结果pojo

    public class SearchResult {
    
    	//商品列表
    	private List<Item> itemList;
    	//总记录数
    	private long recordCount;
    	//总页数
    	private long pageCount;
    	//当前页
    	private long curPage;
    }
    

    1.2Dao层

    分析:尽可能的做的通用一些。参数应该是SolrQuery。返回商品列表、查询结果总记录数

    @Repository
    public class SearchDaoImpl implements SearchDao {
    	@Autowired
    	private SolrServer solrServer;
    
    	@Override
    	public SearchResult search(SolrQuery query) throws Exception{
    		//返回值对象
    		SearchResult result = new SearchResult();
    		//根据查询条件查询索引库
    		QueryResponse queryResponse = solrServer.query(query);
    		//取查询结果
    		SolrDocumentList solrDocumentList = queryResponse.getResults();
    		//取查询结果总数量
    		result.setRecordCount(solrDocumentList.getNumFound());
    		//商品列表
    		List<Item> itemList = new ArrayList<Item>();
    		//取高亮显示
    		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;
    	}
    
    }
    

    1.3Service层

    功能:接收查询条件。查询条件及分页条件(page、rows),创建一个SolrQuery对象。指定查询条件、分页条件、默认搜索域、高亮显示。调用dao层执行查询。得到查询结果计算总页数。返回SearchResult对象。

    @Service
    public class SearchServiceImpl implements SearchService {
    
    	@Autowired
    	private SearchDao searchDao;
    	@Override
    	public SearchResult search(String queryString, int page, int rows) throws Exception {
    		//创建查询对象
    		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;
    	}
    
    }
    

    1.4Controller层

    接收查询参数:查询条件、page、rows

    调用Service执行查询返回一个查询结果对象。

    把查询结果包装到TaotaoResult中返回,结果是json格式的数据。

    如果查询条件为空,返回状态码:400,消息:查询条件不能为空。

    Page为空:默认为1 Rows 为空:默认为50

    @Controller
    public class SearchController {
    	@Autowired 
    	private SearchService searchService;
    	
    	@RequestMapping(value="/query",method=RequestMethod.GET)
    	@ResponseBody
    	public TaotaoResult search(@RequestParam("q")String queryString,
    			@RequestParam(defaultValue="1")Integer page,@RequestParam(defaultValue="50")Integer rows) {
    		//查询条件不能为空
    		if(StringUtils.isBlank(queryString)) {
    			return TaotaoResult.build(400, "查询条件不能为空");
    		}
    		SearchResult searchResult = null;
    		try {
    			queryString = new String(queryString.getBytes("iso8859-1"),"utf-8");
    			searchResult = searchService.search(queryString, page, rows);
    		} catch (Exception e) {
    			e.printStackTrace();
    			return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));
    		}
    		return TaotaoResult.ok(searchResult);
    	}
    }
    

    1.5测试

    image-20200530140518978

    2.调用服务实现搜索功能

    2.1需求分析

    用户在首页中输入查询条件,点击查询向taotao-portal发送请求,参数就是查询的条件,页码。Taoto-portal调用taotao-search发布的服务进行搜索,参数应该是查询条件和页码及每页显示的记录数(参数可选)。Taotao-search返回一个json格式的数据(TaotaoResult包装一个SearchResult对象)。Taotao-portal接收json数据需要把json数据转换成java对象。把java对象传递给jsp页面,jsp渲染java对象得到商品查询结果页面。

    img

    请求url:http://localhost:8082/search.html?q=查询条件

    img

    返回结果:query:回显的查询条件 totalPages:总页数 itemList:商品列表 page:当前页码

    2.2Dao层

    没有

    2.3Service层

    接收两个参数1、查询条件2、页码。调用taotao-search的搜索服务。接收返回的json数据,把json转换成java对象返回SearchResult对象。

    @Service
    public class SearchServiceImpl implements SearchService {
    	@Value("${SEARCH_BASE_URL}")
    	private String SEARCH_BASE_URL;
    
    	@Override
    	public SearchResult search(String queryString, int page) {
    		//调用taotao-search服务
    		//查询参数
    		Map<String, String> param = new HashMap<String, String>();
    		param.put("q", queryString);
    		param.put("page", page+"");
    		try {
    			//调用服务
    			String json = HttpClientUtil.doGet(SEARCH_BASE_URL, param);
    			//把字符串转换成java对象
    			TaotaoResult taotaoResult = TaotaoResult.formatToPojo(json, SearchResult.class);
    			if(taotaoResult.getStatus()==200) {
    				SearchResult result = (SearchResult) taotaoResult.getData();
    				return result;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    }
    

    2.4Controller层

    功能:接收请求的参数查询条件和页码。调用Service查询商品列表得到SearchResult对象。

    需要把query:回显的查询条件 totalPages:总页数 itemList:商品列表 page:当前页码

    传递到页面。返回一个逻辑视图search字符串。

    @Controller
    public class SearchController {
    	@Autowired
    	private SearchService searchService;
    	
    	@RequestMapping("/search")
    	public String search(@RequestParam("q")String queryString,@RequestParam(defaultValue="1")Integer page,Model model) {
    		if(queryString!=null) {
    			try {
    				queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    		SearchResult searchResult = searchService.search(queryString, page);
    		//向页面传递参数
    		model.addAttribute("query", queryString);
    		model.addAttribute("totalPages", searchResult.getPageCount());
    		model.addAttribute("itemList", searchResult.getItemList());
    		model.addAttribute("page", page);
    		return "search";
    	}
    }
    

    实现效果:

    image-20200530195838608

    2.5图片bug修改

    搜索结果中图片展示不出来,因为image字段中存储的图片是多张,使用逗号分隔。

    解决方法:

    img img

    结语

    LPL夏季赛开幕式整挺好,就是有点费韩国队🤣

    另外,Canna来个死全家套餐没意见吧🤢(不懂的科普一下哦,这逼故意打lpl时亮老鼠,老鼠在韩国翻译直接是瘟疫,什么意思不用我多说了吧)

    展开全文
  • 基于Basic,安全访问Solr web 摘要:在搭建好Solr以后,我们可以通过Solr Admin Page管理页面简单的使用Solr,当然不希望这样的页面对外公开访问。可以通过认证的方式加密Solr admin page。 注:使用solr版本 为...

    基于Basic,安全访问Solr web

    摘要:在搭建好Solr以后,我们可以通过Solr Admin Page管理页面简单的使用Solr,当然不希望这样的页面对外公开访问。可以通过认证的方式加密Solr admin page。

    注:使用solr版本 为 7.7版本,单机模式

    Solr集成了以下几种验证方式:
    • Basic自定义身份验证方式
    • Kerberos身份验证方式
    • Hadoop身份验证方式
    本文主要介绍Basic自定义身份验证的使用方式,话不多说,直接进入主题

    第一步:在Solr中创建security.json

    在单机模式下,
    创建security.json文件并将其放在server/solr目录下,与solr.xml同目录。
    如果在SolrCloud模式下,还需要将文件security.json上传到ZooKeeper

    security.json格式如下:

    {
    "authentication":{
       "class":"solr.BasicAuthPlugin",1"blockUnknown": true,2"realm":"My Solr users",【3"credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}4},
    "authorization":{
       "class":"solr.RuleBasedAuthorizationPlugin",5"permissions":[{"name":"security-edit",
          "role":"admin"}],6"user-role":{"solr":"admin"}7}}
    

    此示例中定义了以下几项内容(对于上述代码中的数字):

    1. 基本身份验证插件已启用。
    2. 'blockUnknown’为true时所有没有凭据的请求都将被拒绝,并显示401错误。如果你允许未经身份验证的请求通过,请设置为false(或完全删除它)。但是,如果特定资源受规则保护,则无论如何都会因401错误而拒绝它们。
    3. 可以覆盖该realm属性以在登录提示上显示另一个文本。
    4. 已定义名为“solr”且具有密码的用户,密码加密处理过。
    5. 基于规则的授权插件已启用。
    6. 定义“admin”角色,并且该角色具有编辑安全设置的权限。
    7. "solr"用户已被定义为"admin"角色。

    permissions 中 name 对应的值为角色权限,下面列出几个常用的权限规则,其他的就不一一阐述了,有需要的可以自己查阅官方文档:

    1. security-edit:允许此权限编辑安全配置,意思当前用户可修改security.json中的规则
    2. security-read:允许此权限读取安全配置
    3. all:全能

    第二步:使用curl命令修改security.json内的权限

    下面列举几个常用的命令,使用具有edit或all权限的用户进行下面的操作

    注:不建议直接手动修改security.json内容
    下面示例为添加自己的用户或编辑密码
    下面示例中添加了两个用户,分别是tom跟harry,命令中的solr是用户的名称,SolrRocks为密码。
    添加成功后查看security.json,可以发现已经多了两个user。

    curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d '{"set-user": {"tom":"TomIsCool", "harry":"HarrysSecret"}}'
    

    添加成功后可以直接跳到第三步


    删除用户命令

    curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"delete-user": ["tom", "harry"]}'
    

    更改权限属性

    curl --user solr:SolrRocks http://localhost:8983/solr/admin/authentication -H 'Content-type:application/json' -d  '{"set-property": {"blockUnknown":false}}'
    

    创建新权限,覆盖现有权限定义或为角色分配预定义权限

    curl --user solr:SolrRocks  http://localhost:8983/solr/admin/authorization -H 'Content-type:application/json' -d '{
      "set-permission": {"collection": null,
                         "path":"/admin/collections", //匹配请求路径
                         "params":{"action":["LIST", "CREATE"]}, //请求参数的名称和值
                         "before": 3, //在哪个下标之后
                         "role": "admin", //role:提供此权限的角色的名称
                         "method":"GET" //此权限允许的HTTP方法 GET/POST/DELETE/PUT/HEAD
      }
    }'
    
    curl --user solr:SolrRocks -H  http://localhost:8983/solr/admin/authorization 'Content-type:application/json' -d '{
      "set-permission": {"name": "update", "role":"dev"}, //name:权限名  role:提供此权限的角色的名称
      "set-permission": {"name": "read", "role":"guest"}
    }'
    

    更新或删除权限,可以使用/admin/authorization API查看现有权限及其索引。
    以下示例更新’role’,index为3的权限属性:

    curl --user solr:SolrRocks -H 'Content-type:application/json' -d '{
      "update-permission": {"index": 3, //下标
                           "role": ["admin", "dev"]}    //所要删除的权限
    }' http://localhost:8983/solr/admin/authorization
    

    删除示例

    curl --user solr:SolrRocks -H 'Content-type:application/json' -d '{
      "delete-permission": 3 //下标,不指定role表示删除所有权限
    }' http://localhost:8983/solr/admin/authorization
    

    将角色映射到用户

    curl -u solr:SolrRocks -H 'Content-type:application/json' -d '{
       "set-user-role" : {"solr": ["admin","dev"],  //赋予solr用户 ‘admin’、‘dev’权限
                          "harry": null}            //设为null表示删除
    }' http://localhost:8983/solr/admin/authorization
    

    第三步:重启Solr服务器

    直接在bin目录下输入命令 ./solr restart -force

    重启成功后打开客户端,如图:
    使用刚刚创建的用户登录就可以了。
    image

    展开全文
  • Solr

    2018-01-22 21:37:21
    solr可以实现全文检索功能(索引、搜索),solr是可以独立运行在tomcat等web容器中。 Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。 Solr主要对外提供索引和...

    Solr介绍

    Solr是什么

    Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务。
    solr可以实现全文检索功能(索引、搜索),solr是可以独立运行在tomcat等web容器中。
    这里写图片描述
    Solr不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
    Solr主要对外提供索引和搜索服务。

    Solr和lucene的区别

    Lucene是一个全文检索的工具包(是一堆的jar 包,不能独立运行,由应用程序通过lucene的jar实现全文检索)。

    Solr 是一个全文检索的服务,solr是运行在tomcat等web容器中,对外提供http 的索引和搜索服务。
    Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

    Solr下载

    Solr下载地址
    inux下需要下载lucene-xxx.tgz,windows下需要下载lucene-xxx.zip。
    Solr使用指南可参考
    - Solr的目录文件:
    这里写图片描述
    bin:可执行的程序、脚本
    contrib:扩展的包,用于索引和搜索
    dist:存放Solr的工程(solr-4.10.3.war)和jar包,将工程部署到tomcat上即可运行
    docs:使用说明文档
    example:例子,存储了很多Solr开发使用的例子工程和目录结构等

    example/solr:
        该目录是一个包含了默认配置信息的Solr的Core目录。
    example/multicore:
        该目录包含了在Solr的multicore中设置的多个Core目录。 
    example/webapps:
        该目录中包括一个solr.war,该war可作为solr的运行实例工程。
    

    licenses:solr相关的一些许可信息
    licenses:许可

    Solr运行环境

    Solr
    Jdk
    Tomcat

    Solr安装配置

    SolrCore的安装配置

    • SolrHome和Solrcore
      SolrHome是一个目录 ,是Solr运行的主目录 ,SolrHome目录中包括多个SolrCore目录,每个solrcore目录对应一个索引文件目录 。
      SolrCore即solr实例对外提供索引和搜索服务。
      SolrCore是一个逻辑的概念,将一个solr工程(部署在tomcat中)逻辑区别开以solrcore为单位的服务。
    • 目录结构
      SolrHome目录 结构(solr-xxx\solr-xxx\example\solr例子)
      这里写图片描述
      这里写图片描述
      SolrCore目录 结构
      这里写图片描述
    • 创建SolrCore
      *创建目录:
      先创建SolrHome
      F:\develop下创建solr目录 ,SolrHome目录放到F:\develop\solr下。
      从solr-xxx\solr-xxx\example\solr中的所有文件包括bin复制到创建的solrHome中
      这里写图片描述
      这里写图片描述
      SolrCore目录 :
      这里写图片描述
      *配置文件
      在solrCore的conf 下有一个solrconfig.xml文件,此文件就是solrCore的配置文件:
      这里写图片描述
      加载jar包
      以下配置是solrcore运行所加载的jar包:
      这里写图片描述
      solr.install.dir 表示SolrCore所在目录。
      修改:
      这里写图片描述
      将solr下载包中的contrib、dist两个目录 拷贝到f:\develop\solr下
      这里写图片描述
      更改索引文件目录
      每个SolrCore都有自己的索引文件目录 ,默认在SolrCore目录下的data中。
      这里写图片描述
      data数据目录下包括了index索引目录 和tlog日志文件目录。
      如果不想使用默认的目录也可以通过solrConfig.xml更改索引目录 ,此处使用默认路径如下:
      这里写图片描述
      配置请求处理器
      客户端请求Solr请求处理器,进行索引和搜索。
      在solrconfig.xml中配置了很多的请求处理器
      requestHandler请求处理器,定义了索引和搜索的访问方式。
      通过/update维护索引,可以完成索引的添加、修改、删除操作。
      这里写图片描述
      提交xml、json数据完成索引维护

    通过/select搜索索引。
    这里写图片描述
    设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下:

    <requestHandler name="/select" class="solr.SearchHandler">
        <!-- 设置默认的参数值,可以在请求地址中修改这些参数-->
        <lst name="defaults">
            <str name="echoParams">explicit</str>
            <int name="rows">10</int><!--显示数量-->
            <str name="wt">json</str><!--显示格式-->
            <str name="df">text</str><!--默认搜索字段-->
        </lst>
    </requestHandler>
    • Solr工程部署
      将官方提供的Solr.war部署到tomcat下。
      官方提供的solr的war包是dist\solr-xxx.war

    第一步:部署solr.war
    将dist\solr-xxx.war拷贝到Tomcat的webapp目录下改名为solr.war
    找到bin/startup.bat,启动tomcat后,solr.war自动解压,将原来的solr.war删除
    生成solr工程目录:
    这里写图片描述
    第二步:拷贝扩展包到solr工程
    拷贝example\lib\ext 目录下所有jar包拷贝到Tomcat的webapp\solr\WEB-INF\lib目录下
    第三步:设置solrHome
    修改Tomcat目录 下webapp\solr\WEB-INF\web.xml文件,如下所示:
    设置Solr home
    这里写图片描述
    第四步:拷贝log4j.properties文件
    在 Tomcat下webapps\solr\WEB-INF目录中创建文件 classes文件夹,
    复制Solr目录下example\resources\log4j.properties至Tomcat下webapps\solr\WEB-INF\classes目录
    这里写图片描述

    • 启动tomcat
      solr的主界面
      这里写图片描述
    • solr工程测试
      如下可以测试solr下各各Field的索引和搜索的分词效果。
      这里写图片描述
      如下是solrcore的索引维护界面:
      这里写图片描述
      如下是SolrCore的搜索界面:
      这里写图片描述
    • 多SolrCore配置
      一个solr工程可以通过多个solrcore分别对外提供索引和搜索服务。
      每个solrCore单独对外提供http的索引和搜索服务,相关于一个mysql数据(Solr工程)运行了多个数据库(solrcore)
      配置多SolrCore的好处:
      1.一个solr工程对外通过SorlCore 提供服务,每个SolrCore相当于一个数据库,这个功能就相当于一个mysql可以运行多个数据库。
      2.将索引数据分SolrCore存储,方便对索引数据管理维护。
      3.SolrCloud集群需要使用多core。
      这里写图片描述
      修改collection2下的core.properties,如下:
      这里写图片描述
      删除data目录下的两个文件(因为是复制过来,所以需要删除);
      修改conf目录下的solrconfig.xml中的如下属性:
      这里写图片描述

    Solr的基本使用

    schema.xml

    • Field和fieldType
      schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义了加入索引的数据的数据类型的。主要包括FieldTypes、Fields和其他的一些缺省设置。
      field:进行索引,需要创建document,document中包括 了很多的field(域)。
      field属性:是否索引、是否存储、是否分词 ,是否多值multiValued
      multiValued:该Field如果要存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组:
      这里写图片描述
      Fieldtype:在solr中对每个Field都有一个Type类型。
      在Solr中进行索引、搜索时需要用哪些field需要提前在schema.xml文件中定义!!!!

    通过界面查看 solrCore中有哪些field被定义:
    这里写图片描述
    比如:

    filed的name:name
    indexed:是否索引,true表示要索引,索引的目的为了搜索
    stored:是否存储,存储的目的是为了从索引文件读取数据
    type:text_general
    这里写图片描述

    • 主键(重点)

    Solr在维护索引时要根据主键进行维护,比如创建索引没有指定主键,报如下错误:
    这里写图片描述
    如何指定solr的主键:
    在schema.xml配置id
    Solr中默认定义唯一主键key为id域,如下:
    这里写图片描述
    Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。
    注意在创建索引时必须指定唯一约束。

    • copyField复制域

    copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索:
    比如,输入关键字要搜索title标题和内容content这两个域时,要用到复制域
    定义目标域:
    这里写图片描述
    必须要使用:multiValued=”true”
    将以下的域复制到目标域中:
    这里写图片描述
    如果在搜索时,搜索text域,solr会分别从以上cat、name、manu、features、includes这域中搜索,类似lucene中组合 域 搜索。

    • dynamicField
      使用 solr时要定义很多field比较麻烦,可以定义一种动态域,动态域没有具体的域名是定义一个规则,比如:name 为*_i。
      当创建索引,指定field名称匹配上规则solr就执行成功,比如:动态域*_i,只要以_i结尾 的就可以索引创建成功。
    • 使用solrJ操作solr
      **注意:记住核心类SolrServer,通过SolrServer进行操作
    // 添加
    @Test
    public void testUpdateIndex() throws Exception {
    
        // 创建一个Solr的服务对象---需要solr的路径
        SolrServer solrServer = new HttpSolrServer(solrURL);
    
        // 创建一个SolrInputDocument类型的文档
        SolrInputDocument inputDocument = new SolrInputDocument();
    
        // 给文档赋值--- 需要输入域名和对应的值
        inputDocument.addField("id", "1");
        inputDocument.addField("product_name", "lucene编程指南");
        inputDocument.addField("product_price", 88.8f);
        inputDocument.addField("product_catalog_name", "计算机编程");
        inputDocument.addField("product_description", "lucene编程指南是一本非常有用的书!");
        inputDocument.addField("product_picture", "373737722.jpg");
    
        // 执行更新索引操作---需要一个SolrInputDocument类型的文档
        UpdateResponse response = solrServer.add(inputDocument);
        System.out.println(response);
        // 提交
        solrServer.commit();
    }

    数据导入处理器

    • dataimport-Handler介绍

    solr提供dataimport-Handler数据导入处理器,工作流程:

    1、solr通过dataimport-Handler查询关系数据库中的数据
    2、对查询到的数据创建索引

    上边的过程是自动化完成的。

    可以通过此dataimport-Handler,批量将关系数据库中的数据创建索引到solr索引库中。

    • 实现步骤:

    第一步:加载dataimport的jar包
    将solr\dist\ solr-dataimporthandler-4.10.3.jar拷贝至solr\contrib\dataimporthandler
    配置solrconfig.xml加载jar包:
    这里写图片描述
    第二步:加载mysql数据 驱动包
    方法同上,将mysql数据库驱动的jar拷贝至solr\contrib\databaseDriver下
    配置solrconfig.xml加载jar包:
    这里写图片描述
    第三步:配置dataimport导入数据
    创建data-config.xml文件,存放在SolrCore的conf目录
    此段代码需要根据情况进行修改

    <?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="mysql"/>   
        <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>

    第四步:修改solrconfig.xml,添加requestHandler

    <!--数据导入处理器-->
    <requestHandler name="/dataimport" 
        class="org.apache.solr.handler.dataimport.DataImportHandler">
        <lst name="defaults">
            <str name="config">data-config.xml</str>
        </lst>
    </requestHandler>
    • 测试数据导入
      这里写图片描述
      导入数据成功

    solrj进行搜索

    • solr的查询语法

    1.q - 查询关键字,必须的,如果查询所有使用:
    请求的q是字符串
    这里写图片描述
    2.fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如::
    请求fq是一个数组(多个值)
    这里写图片描述
    过滤查询价格从1到20的记录。
    也可以在“q”查询条件中使用product_price:[1 TO 20],如下:
    这里写图片描述
    也可以使用“*”表示无限,例如:
    20以上:product_price:[20 TO *]
    20以下:product_price:[* TO 20]
    3.sort - 排序,格式:field name desc/asc… 。示例:
    这里写图片描述
    按价格降序

    4.start - 分页显示使用,开始记录下标,从0开始
    5.rows - 指定返回结果最多有多少条记录,配合start来实现分页。
    这里写图片描述
    显示前10条。
    6.fl - 指定返回那些字段内容,用逗号或空格分隔多个。
    这里写图片描述
    显示商品图片、商品名称、商品价格
    7.df-指定一个搜索Field
    这里写图片描述
    也可以在SolrCore目录 中conf/solrconfig.xml文件中指定默认搜索Field,指定后就可以直接在“q”查询条件中输入关键字。
    这里写图片描述
    8.wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。
    9.hl 是否高亮 ,设置高亮Field,设置格式前缀和后缀。
    这里写图片描述
    - 代码实现:

    // 不指定solrCore,默认一个core
    private static String solrUrl = "http://localhost:8080/solr";
    
    // 指定solrCore名称
    // private static String solrUrl = "http://localhost:8080/solr/collection1";
    
    @Test
    public void testSearchIndex() throws SolrServerException {
        SolrServer solrServer = new HttpSolrServer(solrUrl);
    
        //查询对象 
        SolrQuery query = new SolrQuery();
    
        //查询语法 
        query.set("q", "product_name:天下");
        //过虑
        query.add("fq", "product_price:[0 TO 2]");
        //query.add("fq", "product_catalog_name:另类文体");
        //指定查询field
        query.set("fl", "id,product_name");
        //排序
        query.addSort("product_name", ORDER.desc);
    
        //分页信息
        //每页显示个数
        int pageSize=3;
    
        //当前页码
        int curPage=200;
    
        //开始下标 
        int start = pageSize * (curPage-1);
        query.setStart(start);
        //每页显示个数
        query.setRows(pageSize);
    
        //高亮 
        query.setHighlight(true);//开启高亮组件
        query.addHighlightField("product_name");//高亮字段
        query.setHighlightSimplePre("<span color=red>");// 前缀标记
        query.setHighlightSimplePost("</span>");// 后缀标记
    
        //查询响应
        QueryResponse response = solrServer.query(query);
        //匹配文档
        SolrDocumentList docs = response.getResults();
        //匹配文档总数
        long numFound = docs.getNumFound();
        System.out.println("匹配文档总数:"+numFound);
        //从响应中获取高亮信息
        Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
    
        for(SolrDocument doc:docs){
            //商品id
            System.out.println("id:"+doc.get("id"));
            //商品名称
            System.out.println("product_name:"+doc.get("product_name"));
            //商品价格
            System.out.println("product_price:"+doc.get("product_price"));
            //...
    
            //取出高亮信息
            if(highlighting!=null){
                //根据id主键取出高亮信息 
                Map<String, List<String>> map = highlighting.get(doc.get("id"));
                //取出高亮字段信息
                List<String> list = map.get("product_name");
                System.out.println("product_name高亮后:"+list.get(0));
            }
    
        }
    
    }
    展开全文
  • Solr学习总结(三)Solr web 管理后台

    千次阅读 2018-07-14 18:08:06
    还有solr 自带的web 管理系统如何使用等。只有先明白了solr的基本内容,后续学习solr 的C#和数据库操作,才不会费劲。本人刚开始也是配置完solr 之后,直接找solr客户端,写相应的测试代码,但是由于...
    前面讲到了Solr的安装,按道理,这次应该讲讲.net与数据库的内容,C#如何操作Solr索引等。不过我还是想先讲一些基础的内容,比如solr查询参数如何使用,各个参数都代表什么意思? 还有solr 自带的web 管理系统如何使用等。只有先明白了solr的基本内容,后续学习solr 的C#和数据库操作,才不会费劲。本人刚开始也是配置完solr 之后,直接找solr客户端,写相应的测试代码,但是由于不知道一个Update请求具体都需要哪些参数,各个参数都是什么意思,以至于碰到各种solr 的基础问题,都不知道问题在哪? 前车之鉴。
    

     

      Solr web管理后台

        访问主页:http://localhost:8080/solr/#/

        1. Dashboard 仪表盘,显示Solr的基本信息,包含solr版本,包含系统内存和jvm内存的使用情况,jvm参数等

          

        2. Logging solr的运行日志, 用来查看solr运行是否有警告或者异常,以便及时处理

     

        3. Core Admin 索引库管理,这个界面很重要,这使多核的配置,索引库的优化等,变得非常简单;
          主要功能包括:AddCore(添加核心,即索引库),Unload(卸载核心),Rename(重命名核心),Optimize(优化索引库)。

           

        4. Core Selector 核心选择器,选择要操作的索引库

          

          1. Overview(概览):查看索引的情况,例如:看看Num docs数量是否增加。包含基本统计如当前文档数;和实例信息如当前核心的配置目录;

     

          2. Analysis(分析):检验分词效果,用来诊断潜在的 文本分析 的查询/索引问题。注意FieldType需要选定为与被分析内容类型一致。

     

          3. Query(查询):这是一个查询界面,用的比较多,用来查询索引的文档,包含是否存在,排序是否正确等。稍后会介绍相关的查询参数。

           

           注意:如果没有做分词,相关的字段查询是精确匹配的,比如 将q 输入 title:me  即 查询title 为 me 的数据。

           

          4. Schema(当前索引库定义),显示当前的schema的配置文件,即schema.xml的内容,例如:可以看到schema.xml 中的配置的字段等信息。

            

          5. Documents (索引文档)索引的相关操作,增加,修改,删除等,例如我们要增加一个索引

            a. 先要在solr 的D:\solr_home\mycore1\conf  的 schema.xml配置文件下,增加相关的字段field,例如: 

               <field name="title" type="string" indexed="true" stored="true" required="true" multiValued="false" />

            b. 在如下页面,选择/update ,文档格式选择json ,然后submit 提交。这样 索引就增加上了。

            c. 删除所以也是类似,只不过Document(s) 里面的xml一样 ,这个是删除全部的索引  <delete><query>*:*</query></delete><commit/>, 注意:这个<commit/>节点不能少,否则删除动作的事务不会提交。

           

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,211
精华内容 4,484
关键字:

web请求solr