solr的应用(三)solr在分布式项目中的查询

solr在分布式项目中的查询

创建jar工程youlexuan_search_interface和war工程youlexuan_search_service
在这里插入图片描述
youlexuan_search_interface需要依赖youlexuan_pojo

<dependencies>
    <dependency>
        <groupId>com.youxin</groupId>
        <artifactId>youlexuan_pojo</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

youlexuan_search_service的pom依赖

<properties>
    <webVersion>3.0</webVersion>
</properties>

<dependencies>
    <!-- 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-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>dubbo</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
    </dependency>


    <!--导入自己的项目-->
    <dependency>
        <groupId>com.youxin</groupId>
        <artifactId>youlexuan_common</artifactId>
        <version>1.0.0</version>
    </dependency>


    <dependency>
        <groupId>com.youxin</groupId>
        <artifactId>youlexuan_search_interface</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>5.0.6.RELEASE</version>
        <scope>compile</scope>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <port>9006</port>
                <path>/</path>
                <uriEncoding>utf-8</uriEncoding>
            </configuration>
        </plugin>
    </plugins>
</build>

youlexuan_search_service的spring-search-dubbo.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    		http://www.springframework.org/schema/beans/spring-beans.xsd 
    		http://code.alibabatech.com/schema/dubbo 
    		http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
	
	<dubbo:protocol name="dubbo" port="20883"/>
	
	<!-- 提供方应用信息,用于计算依赖关系 -->
	<dubbo:application name="youlexuan_search_service" />

	<!-- 向zk注册服务 -->
	<dubbo:registry address="zookeeper://192.168.2.123:2181" />

	<!-- 扫描带service注解的类 -->
	<dubbo:annotation package="com.youxin.search.service.impl" />

</beans>

youlexuan_search_service的spring-search-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    		http://www.springframework.org/schema/beans/spring-beans.xsd 
    		http://www.springframework.org/schema/context 
    		http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.youxin" />

</beans>

youlexuan_search_service的spring-search-solr.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:solr="http://www.springframework.org/schema/data/solr"
       xsi:schemaLocation="http://www.springframework.org/schema/data/solr
  		http://www.springframework.org/schema/data/solr/spring-solr.xsd
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- solr服务器地址和solr库 -->
    <solr:solr-server id="solrServer" url="http://192.168.2.123:8983/solr/core1" />

    <!-- solr模板,使用solr模板可对索引库进行CRUD操作 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg ref="solrServer" />
    </bean>
</beans>

实现类代码

@Service
public class ItemSearchServiceImpl implements ItemSearchService {

    @Autowired
    private SolrTemplate solrTemplate;

    @Override
    public Map<String, Object> search(Map searchMap) {
        Query query = new SimpleQuery();
        // is:基于分词后的结果 和 传入的参数匹配
        Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
        // 添加查询条件
        query.addCriteria(criteria);
        ScoredPage<TbItem> pages = solrTemplate.queryForPage(query, TbItem.class);
        Map<String,Object> map = new HashMap<>();
        map.put("rows",pages.getContent());//getContent()获取数据列表
        return map;
    }
}

最后web层调用我们搭建好的service层即可
在这里插入图片描述

搜索关键字高亮

在这里插入图片描述
在这里插入图片描述

public Map<String, Object> search(Map searchMap) {
	HighlightQuery query = new SimpleHighlightQuery();
	HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");//设置高亮的域
	//设置前后缀
	highlightOptions.setSimplePrefix("<span style='color:red'>");
	highlightOptions.setSimplePostfix("</span>");
	//设置高亮选项
	query.setHighlightOptions(highlightOptions);
	// is:基于分词后的结果 和 传入的参数匹配
	Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
	// 添加查询条件
	query.addCriteria(criteria);
	//查询带高亮结果的数据
	HighlightPage<TbItem> pages = solrTemplate.queryForHighlightPage(query, TbItem.class);
	//将查询出来带高亮结果的数据放到title中
	for (HighlightEntry<TbItem> highlightEntry : pages.getHighlighted()) {
	    TbItem item = highlightEntry.getEntity();
	    //加入判断,避免为null的时候数组越界
	    if (highlightEntry.getHighlights().size()>0 && highlightEntry.getHighlights().get(0).getSnipplets().size()>0){
	        item.setTitle(highlightEntry.getHighlights().get(0).getSnipplets().get(0));
	    }
	}
	Map<String,Object> map = new HashMap<>();
	map.put("rows",pages.getContent());//getContent()获取数据列表
	return map;
}

分类搜索

根据用户搜索的关键字,在下方列出搜索与搜索关键字相近的商品分类
通过操作solr的分组api实现
在这里插入图片描述

public Map<String, Object> search(Map searchMap) {

    Map<String,Object> map = new HashMap<>();
    List list = new ArrayList();
    Query query = new SimpleQuery();
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    query.addCriteria(criteria);
    //设置分组选项
    GroupOptions groupOptions = new GroupOptions().addGroupByField("item_category");
    query.setGroupOptions(groupOptions);
    //得到分组页
    GroupPage<TbItem> pages = solrTemplate.queryForGroupPage(query, TbItem.class);
    // 根据列得到分组结果集
    GroupResult<TbItem> groupResult = pages.getGroupResult("item_category");
    // 得到分组结果入口页
    Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
    // 得到分组入口集合
    List<GroupEntry<TbItem>> content = groupEntries.getContent();

    for (GroupEntry<TbItem> entry : content) {
        list.add(entry.getGroupValue());
    }

    map.put("categoryList", list);
    return map;
}

代码整理

public Map<String, Object> search(Map searchMap) {

    Map<String,Object> map = new HashMap<>();
    //关键字高亮
    highlight(searchMap,map);
    //根据关键字获取分类
    categoryList(searchMap,map);
    return map;
}
private void categoryList(Map searchMap,Map map){
    List list = new ArrayList();
    Query query = new SimpleQuery();
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    query.addCriteria(criteria);
    //设置分组选项
    GroupOptions groupOptions = new GroupOptions().addGroupByField("item_category");
    query.setGroupOptions(groupOptions);
    //得到分组页
    GroupPage<TbItem> pages = solrTemplate.queryForGroupPage(query, TbItem.class);
    // 根据列得到分组结果集
    GroupResult<TbItem> groupResult = pages.getGroupResult("item_category");
    // 得到分组结果入口页
    Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
    // 得到分组入口集合
    List<GroupEntry<TbItem>> content = groupEntries.getContent();

    for (GroupEntry<TbItem> entry : content) {
        list.add(entry.getGroupValue());
    }

    map.put("categoryList", list);
}
/*
关键字高亮
 */
private void highlight(Map searchMap,Map map){
    HighlightQuery query = new SimpleHighlightQuery();
    HighlightOptions highlightOptions = new HighlightOptions().addField("item_title");//设置高亮的域
    //设置前后缀
    highlightOptions.setSimplePrefix("<span style='color:red'>");
    highlightOptions.setSimplePostfix("</span>");
    //设置高亮选项
    query.setHighlightOptions(highlightOptions);
    // is:基于分词后的结果 和 传入的参数匹配
    Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
    // 添加查询条件
    query.addCriteria(criteria);
    //查询带高亮结果的数据
    HighlightPage<TbItem> pages = solrTemplate.queryForHighlightPage(query, TbItem.class);
    //将查询出来带高亮结果的数据放到title中
    for (HighlightEntry<TbItem> highlightEntry : pages.getHighlighted()) {
        TbItem item = highlightEntry.getEntity();
        //加入判断,避免为null的时候数组越界
        if (highlightEntry.getHighlights().size()>0 && highlightEntry.getHighlights().get(0).getSnipplets().size()>0){
            item.setTitle(highlightEntry.getHighlights().get(0).getSnipplets().get(0));
        }
    }
    map.put("rows",pages.getContent());//getContent()获取数据列表
}

补充

在这里插入图片描述

q:查询关键字:必须的,如果查询所有使用* : *
fq:(filter query)过虑查询:作用:在q查询符合结果中同时是fq查询符合的
如:过滤查询价格从1到20的记录,使用price:[1 TO 20]
也可以使用“*”表示无限,例如:
20以上:price:[20 TO ]
20以下:price:[
TO 20]

sort:排序:格式:sort=+<desc|asc>[,+<desc|asc>]… 。
示例:product_price desc 按照价格从高到低进行排序
product_price asc 按照价格从低到高进行排序
start, rows:行的索引,从0开始,[start, rows]
fl:指定返回那些字段内容:用逗号或空格分隔多个,不写默认返回全部配置的。
df:指定一个默认搜索Field:一般默认
wt:(writer type)指定输出格式:可以有xml, json, csv, python, php等格式
hl:是否高亮:设置高亮Field,设置格式前缀和后缀。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值