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,設置格式前綴和後綴。