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,设置格式前缀和后缀。