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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章