Solr


solr

什么是Solr

直接使用sql搜索存在的問題

  • 大多數搜索引擎應用都必須具有某種搜索功能
  • 搜索功能往往是巨大的資源消耗
  • 它們由於沉重的數據庫加載而拖垮你的應用的性能
  • 所有我們一般在做搜索的時候 會把它單獨轉移到一個外部的搜索服務器當中進行
  • Apache Solr是一個流行的開源搜索服務器

Apache Solr

  • Solr是一個開源搜索平台,用於構建搜索應用程序。
  • 是一個獨立的企業級搜索應用服務器,它對外提供類似於Web-service的API接口
  • 它建立在Lucene(全文搜索引擎)之上。
  • Solr是企業級的,快速的和高度可擴展的。
  • 用戶可以通過http請求,向搜索引擎服務器提交一定格式的XML文件,生成索引;也可以通過Http Get操作提出查找請求,並得到XML格式的返回結果。

為什么選擇Solr ?

  • 第一點原因:來自SQL數據庫在性能上缺乏亮點。基本上,你需要在你的查詢中使用JOIN操作。
  • 第二點原因是文檔的天然數據特性松散的文本文件,這種查詢都是需要使用LIKE。然而joins和likes都是性能殺手,在目前的數據庫引擎中是不方便的。
  • solr底層采用的是倒排索引。這種數據結構類似與美化過的詞典

Solr 關鍵特性

1.基於標准的開放接口:Solr搜索服務器支持通過XML、JSON和HTTP查詢和獲取結果。
2.易管理:Solr可以通過HTML頁面管理,Solr配置通過XML完成。
3.可伸縮性:能夠有效地復制到另外一個Solr搜索服務器。
4.靈活的插件體系:新功能能夠以插件的形式方便的添加到Solr服務器上。
5.強大的數據導入功能:數據庫和其他結構化數據源現在都可以導入、映射和轉化。

Solr安裝

解壓tomcat
    mkdir /usr/local/solr
    cd /usr/local/solr
    tar -zxvf apache-tomcat-8.5.32.tar.gz 
    mv apache-tomcat-8.5.32 tomcat
    有可能會存在tomcat在centos7中啟動緩慢的現象
    	安裝:yum -y install rng-tools
    	開啟 rng-tools服務:service rngd start
    	
解壓solr
	tar -zxvf solr-4.10.3.tar
	
解壓IK
	unzip IKAnalyzer.zip
	
復制solr.war到tomcat/webapp下
	cd /usr/local/solr/solr-4.10.3/example/webapps/
	cp solr.war /usr/local/solr/tomcat/webapps/
	
啟動tomcat讓solr.war自動解壓
	/usr/local/solr/tomcat/bin
	./startup.sh
	
關閉tomcat后才能刪除solr.war包,否則會連帶solr應用一起刪除
	/usr/local/solr/tomcat/bin
	./shutdown.sh
	
進入到webapps刪除solr.war包
	cd /usr/local/solr/tomcat/webapps/
	rm -rf solr.war
	
將solr-4.10.3/example/lib/ext/目錄下的所有jar包拷貝到/usr/local/solr/tomcat/webapps/solr/WEB-INF/lib目錄中
	cd /usr/local/solr/solr-4.10.3/example/lib/ext
	cp *  /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib
	
將solr-4.10.3/example/目錄下的solr文件夾復制到/usr/local/solr/目錄下,並且返回到/usr/local/solr目錄下將solr重命名為solrhome
	cd /usr/local/solr/solr-4.10.3/example/
	cp -r solr /usr/local/solr/
	cd /usr/local/solr
	mv solr solrhome
	
配置tomcat/webapps/solr/WEB-INF/web.xml家的位置
	cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
	vim web.xml
	添加solrhome(/usr/local/solr/solrhome)
	<env-entry>
		<env-entry-name>solr/home</env-entry-name>
		<env-entry-value>/usr/local/solr/solrhome</env-entry-value>
		<env-entry-type>java.lang.String</env-entry-type>
	</env-entry>
啟動tomcat
	/usr/local/solr/tomcat/bin/
	./startup.sh

tomcat在linux中啟動慢解決方式

中文分詞器

IK Analyzer簡介

  • IK Analyzer 是一個開源的,基於 java 語言開發的輕量級的中文分詞工具包。
  • 它是以開源項目Luence 為應用主體的,結合詞典分詞和文法分析算法的中文分詞組件
  • IK 實現了簡單的分詞歧義排除算法,標志着 IK 分詞器從單純的詞典分詞向模擬語義分詞衍化。
  • 作用: 有中文語義分析的效果, 對中文分詞效果好.

IK Analyzer(配置)

把IKAnalyzer2012FF_u1.jar 添加到 solr 工程的 lib 目錄下
	cd /usr/local/solr/IKAnalyzer/
	cp IKAnalyzer2012FF_u1.jar /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/
	
創建WEB-INF/classes文件夾
	cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/
	mkdir classes
	
把擴展詞典、停用詞詞典、配置文件放到 solr 工程的 WEB-INF/classes 目錄下
	cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
	cp /usr/local/solr/IKAnalyzer/IKAnalyzer.cfg.xml ./
	cp /usr/local/solr/IKAnalyzer/ext_stopword.dic ./ 

將ext_stopword.dic文件名修改為stopword.dic
	mv ext_stopword.dic stopword.dic

修改IKAnalyzer.cfg.xml配置文件
	stopword.dic已經有了,ext.dic還沒有
	cd /usr/local/solr/tomcat/webapps/solr/WEB-INF/classes
	vi IKAnalyzer.cfg.xml
	:wq
    <?xml version=1.0" encoding='UTF-8"?>
    <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
    <properties>
        <comment>IKAnalyzer擴展配置</comment>
        <--用戶可以在這里配置自己的擴展字典-->
        <entry key="ext_dict">ext.dic;</entry>
        <--用戶可以在這里配置自己的擴展停止詞字典-->
        <entry key="ext_stopwords">stopword.dic</entry>
    </properties>

    創建ext.dic
        touch ext.dic

    stopword.dic-停止詞典
        切分詞的時候, 凡是出現在停止詞典中的詞都會被過濾掉.
	
    ext.dic-擴展詞典
        凡是專有名詞都會放到這里, 如果自然語義中不是一個詞, 放到這里后solr
        切分詞的時候就會切分成一個詞.
	
配置分詞器
    修改 Solrhome 的 schema.xml 文件
        cd /usr/local/solr/solrhome/collection1/conf
        vim schema.xml
            在最后添加
                <fieldType name="text_ik" class="solr.TextField">
                	<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
                </fieldType>
    自定義域名使用自己創建的分詞器
        <field name="content_ik" type="text_ik" indexed="true" stored="true"/>
	
配置完畢后重啟tomcat

什么是域

  • 域相當於數據庫的表字段,用戶存放數據
  • 用戶根據業務需要去定義相關的Field(域)

域的分類

field普通域
	大多數情況都可以用這個域來完成, 主要定義了域名和域的類型.
	
copyField復制域
	復制域中有source叫做源域, dest代表目標域, 
	在維護數據的時候, 源域中的內容會復制到目標域中一份, 
	從目標域中搜索, 就相當於從多個源域中搜索一樣
	
dynamicField動態域
	solr中域名要先定義后使用, 沒有定義就使用會報錯, 
	起到模糊匹配的效果,可以模糊匹配沒有定義過的域名,相當於通配符的作用
	
uniqueKey主鍵域
	在添加數據的時候必須有主鍵域, 沒有會報錯, 這個不用添加也不用修改, 就使用這個默認的域名id就可以.

域的常用屬性

  • name:指定域的名稱
  • type:指定域的類型
  • indexed:是否索引
  • stored:是否存儲
  • required:是否必須
  • multiValued:是否多值

普通域

<fieldType name="text_ik" class="solr.TextField">
     <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>


<field name="content_ik" type="text_ik" indexed="true" stored="true"/>
<field name="item_goodsid" type="long" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="double" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category" type="string" indexed="true" stored="true" />
<field name="item_seller" type="text_ik" indexed="true" stored="true" />
<field name="item_brand" type="string" indexed="true" stored="true" />
<field name="item_updatetime" type="date" indexed="true" stored="true" />

復制域

<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
<copyField source="item_seller" dest="item_keywords"/>
<copyField source="item_brand" dest="item_keywords"/>

動態域

<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />

solrj

概述

  • solrJ是solr官方推出的客戶端工具包, 將solrj的jar包放到我們項目中
  • 我們就可以調用solrj中的api來遠程給solr服務器發送命令, solr服務器就可以完成對索引庫的操作(添加修改刪除查詢)

操作步驟

創建一個普通的Java工程

添加soloJ相關Jar包

<!-- solr客戶端 -->
<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>${solrj.version}</version>
</dependency>

操作

添加或者修改

//修改時, 會把以前的內容刪除, 然后再添加
@Test
public void testIndexCreateAndUpdate() throws Exception {
	/**
	* 創建和solr服務器連接
  	* http://192.168.1.88:8080/solr是連接的默認實例也就是collection1實例
 	 * http://192.168.1.88:8080/solr/collection2實例
    */
    SolrServer solrServer = new HttpSolrServer("http://192.168.1.88:8080/solr");
    //創建文檔對象
    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", "002");
    doc.addField("title", "后裔");
    doc.addField("price", "250");
    //添加或者修改
    solrServer.add(doc);
    //提交
    solrServer.commit();
    }
}
查詢所有

@Test
public void testIndexSearch() throws Exception {
	SolrServer solrServer = new HttpSolrServer("http://192.168.1.88:8080/solr");
	//創建查詢對象
	SolrQuery query = new SolrQuery();
	//設置查詢條件
	query.setQuery("*:*");
	//查詢並返回響應
	QueryResponse queryResponse = solrServer.query(query);
	//從響應中獲取結果集
	SolrDocumentList results = queryResponse.getResults();
	System.out.println("count=" + results.getNumFound());
	for (SolrDocument result : results) {
		System.out.println("id=" + result.get("id"));
		System.out.println("title=" + result.get("title"));
	}
}
刪除
@Test
public void testIndexDelete() throws Exception {
	SolrServer solrServer = new HttpSolrServer("http://192.168.1.88:8080/solr");
	//單個刪除
	//solrServer.deleteById("001");
	//刪除所有
	solrServer.deleteByQuery("*:*");
	//提交
	solrServer.commit();
}

Spring Data Solr

簡介

  • Spring Data Solr就是為了方便Solr的開發所研制的一個框架
  • 其底層是對SolrJ(官方API)的封裝

入門

(1)創建maven工程SpringSolrProject jar項目

(2)pom.xml中引入依賴

<properties>
	<spring.version>5.1.7.RELEASE</spring.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jms</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context-support</artifactId>
		<version>${spring.version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-test</artifactId>
		<version>${spring.version}</version>
	</dependency>


    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-solr</artifactId>
        <version>1.5.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.1.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
</dependencies>

(3)在src/main/resources下創建applicationContext-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:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   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-1.0.xsd
	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">
    <!-- solr服務器地址 -->
    <solr:solr-server id="solrServer" url="http://192.168.1.88:8080/solr" />

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

(4)創建 cn.fmjava.pojo 包 引入 Item實體類

import lombok.Data;
import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.solr.core.mapping.Dynamic;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;

@Data
public class Item implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 商品id,同時也是商品編號
     */
    @Field
    private Long id;

    /**
     * 商品標題
     */
    @Field("item_title")
    private String title;

    /**
     * 商品賣點
     */
    private String sellPoint;

    /**
     * 商品價格,單位為:元
     */
    @Field("item_price")
    private BigDecimal price;

    private Integer stockCount;

    /**
     * 庫存數量
     */
    private Integer num;

    /**
     * 商品條形碼
     */
    private String barcode;

    /**
     * 商品圖片
     */
    @Field("item_image")
    private String image;

    /**
     * 所屬類目,葉子類目
     */
    private Long categoryid;

    /**
     * 商品狀態,1-正常,2-下架,3-刪除
     */
    private String status;

    /**
     * 創建時間
     */
    private Date createTime;

    /**
     * 更新時間
     */
    @Field("item_updatetime")
    private Date updateTime;

    private String itemSn;

    private BigDecimal costPirce;

    private BigDecimal marketPrice;

    private String isDefault;

    @Field("item_goodsid")
    private Long goodsId;

    private String sellerId;

    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    private String spec;

    @Field("item_seller")
    private String seller;

    @Dynamic
    @Field("item_spec_*")
    private Map<String,String> specMap;

    public Map<String, String> getSpecMap() {
        return specMap;
    }

    public void setSpecMap(Map<String, String> specMap) {
        this.specMap = specMap;
    }

}

(5)配置業務域

修改solrhome的schema.xml 文件 設置業務系統 Field
<field name="item_goodsid" type="long" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="double" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category" type="string" indexed="true" stored="true" />
<field name="item_seller" type="text_ik" indexed="true" stored="true" />
<field name="item_brand" type="string" indexed="true" stored="true" />
<field name="item_updatetime" type="date" indexed="true" stored="true" />
復制域的作用在於將某一個Field中的數據復制到另一個域中
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
<copyField source="item_seller" dest="item_keywords"/>
<copyField source="item_brand" dest="item_keywords"/>
動態擴充字段時,我們需要使用動態域
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />	

配置
cd /usr/local/solr/solrhome/collection1/conf
vim schema.xml
<field name="item_goodsid" type="long" indexed="true" stored="true"/>
	<field name="item_title" type="text_ik" indexed="true" stored="true"/>
	<field name="item_price" type="double" indexed="true" stored="true"/>
	<field name="item_image" type="string" indexed="false" stored="true" />
	<field name="item_category" type="string" indexed="true" stored="true" />
	<field name="item_seller" type="text_ik" indexed="true" stored="true" />
	<field name="item_brand" type="string" indexed="true" stored="true" />
<field name="item_updatetime" type="date" indexed="true" stored="true" />

<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
<copyField source="item_seller" dest="item_keywords"/>
<copyField source="item_brand" dest="item_keywords"/>

<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />	

重啟tomcat
/usr/local/solr/tomcat/bin/shutdown.sh
/usr/local/solr/tomcat/bin/startup.sh

(6)在實體類字段上添加@Field注解

public class Item implements Serializable {
    /**
     * 商品id,同時也是商品編號
     */
    @Field
    private Long id;

    /**
     * 商品標題
     */
    @Field("item_title")
    private String title;

    /**
     * 商品賣點
     */
    private String sellPoint;

    /**
     * 商品價格,單位為:元
     */
    @Field("item_price")
    private BigDecimal price;

    private Integer stockCount;

    /**
     * 庫存數量
     */
    private Integer num;

    /**
     * 商品條形碼
     */
    private String barcode;

    /**
     * 商品圖片
     */
    @Field("item_image")
    private String image;

    /**
     * 所屬類目,葉子類目
     */
    private Long categoryid;

    /**
     * 商品狀態,1-正常,2-下架,3-刪除
     */
    private String status;

    /**
     * 創建時間
     */
    private Date createTime;

    /**
     * 更新時間
     */
    private Date updateTime;

    private String itemSn;

    private BigDecimal costPirce;

    private BigDecimal marketPrice;

    private String isDefault;

    @Field("item_goodsid")
    private Long goodsId;

    private String sellerId;

    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    private String spec;

    @Field("item_seller")
    private String seller;

    private static final long serialVersionUID = 1L;
}

(7)創建測試類

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-solr.xml")
public class TestIndexManager {
    @Autowired
    private SolrTemplate solrTemplate;
    //添加更新
    @Test
    public void testIndexCreatAndUpdate() {
        List<Item> itemList = new ArrayList<Item>();
        for(long i= 1; i < 100; i++) {
            Item item = new Item();
            item.setId(i);
            item.setTitle("魯班" + i);
            item.setCategory("射手");
            item.setPrice(new BigDecimal("100"+i));
            item.setBrand("王者");
            itemList.add(item);
        }
        //保存
        //solrTemplate.saveBean(itemList);
        solrTemplate.saveBeans(itemList);
        //提交
        solrTemplate.commit();
    }

	//刪除
    @Test
    public void testIndexDelte() {
        //根據主鍵域id刪除
        //solrTemplate.deleteById("1");

        //創建查詢對象
        Query query = new SimpleQuery("*:*");
        //根據查詢條件刪除
        solrTemplate.delete(query);
        //提交
        solrTemplate.commit();
    }

	//查詢
    @Test
    public void testSearch() {
        //創建查詢對象
        //Query query = new SimpleQuery("*:*");
        //創建查詢對象
        Query query = new SimpleQuery();
        //創建查詢條件對象, 注意這里的Criteria對象和mybatis中的那個不是同一個, 只是同名而已
        Criteria criteria = new Criteria("item_title").contains("魯班");
        //查詢對象中放入查詢條件
        query.addCriteria(criteria);
        //從第幾條開始查詢
        query.setOffset(11);
        //設置每頁查詢多少條數據
        query.setRows(20);
        //查詢並返回結果
        ScoredPage<Item> items = solrTemplate.queryForPage(query, Item.class);
        //總頁數
        int totalPages = items.getTotalPages();
        //查詢到的總記錄數
        long totalElements = items.getTotalElements();
        //查詢到的數據集合
        List<Item> content = items.getContent();
        //每頁有多少條數據
        int numberOfElements = items.getNumberOfElements();
        System.out.println("==========");
        System.out.println(content);
    }
}

庫存數據批量導入

作用

  • 查詢庫存數據庫中所有的數據
  • 把數據導入到索引庫當中
  • 只需要要用一次, 當索引庫當中的數據出現損壞或文件丟失時, 再次調用

創建solr-util(jar),引入依賴dao項目

<dependencies>
	<dependency>
		<groupId>com.itxk</groupId>
		<artifactId>dao</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
</dependencies>

在common工程當中引入pom依賴

<!-- solr -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-solr</artifactId>
    <version>1.5.5.RELEASE</version>
</dependency>

在solr-util項目src/main/resource/spring文件夾下創建

spring/applicationContext-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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
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-1.0.xsd
	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">

    <!-- solr服務器地址 -->
    <solr:solr-server id="solrServer" url="http://192.168.1.88:8080/solr" />

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

spring/applicationContext.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

	<context:component-scan base-package="com.fmjava.core.util"></context:component-scan>

</beans>

把pojo/item添加@Field

@Data
public class Item implements Serializable {
    private static final long serialVersionUID = 1L;
    
    /**
     * 商品id,同時也是商品編號
     */
    @Field
    private Long id;

    /**
     * 商品標題
     */
    @Field("item_title")
    private String title;

    /**
     * 商品賣點
     */
    private String sellPoint;

    /**
     * 商品價格,單位為:元
     */
    @Field("item_price")
    private BigDecimal price;

    private Integer stockCount;

    /**
     * 庫存數量
     */
    private Integer num;

    /**
     * 商品條形碼
     */
    private String barcode;

    /**
     * 商品圖片
     */
    @Field("item_image")
    private String image;

    /**
     * 所屬類目,葉子類目
     */
    private Long categoryid;

    /**
     * 商品狀態,1-正常,2-下架,3-刪除
     */
    private String status;

    /**
     * 創建時間
     */
    private Date createTime;

    /**
     * 更新時間
     */
    @Field("item_updatetime")
    private Date updateTime;

    private String itemSn;

    private BigDecimal costPirce;

    private BigDecimal marketPrice;

    private String isDefault;

    @Field("item_goodsid")
    private Long goodsId;

    private String sellerId;

    private String cartThumbnail;

    @Field("item_category")
    private String category;

    @Field("item_brand")
    private String brand;

    private String spec;

    @Field("item_seller")
    private String seller;

    @Dynamic
    @Field("item_spec_*")
    private Map<String,String> specMap;

    public Map<String, String> getSpecMap() {
        return specMap;
    }

    public void setSpecMap(Map<String, String> specMap) {
        this.specMap = specMap;
    }
}

創建類SolrUtil ,實現商品數據的查詢(已審核商品)

@Component
public class DataImportToSolr {

    @Autowired
    private SolrTemplate solrTemplate;
    @Autowired
    private ItemDao itemDao;
    public void importItemDataToSolr() {
        ItemQuery query = new ItemQuery();
        ItemQuery.Criteria criteria = query.createCriteria();
        criteria.andStatusEqualTo("1");
        List<Item> items = itemDao.selectByExample(query);
        if (items != null) {
            for (Item item : items) {
                //獲取規格json格式字符串
                String specJsonStr = item.getSpec();
                Map map = JSON.parseObject(specJsonStr, Map.class);
                item.setSpecMap(map);
            }
            //保存
            solrTemplate.saveBeans(items);
            //提交
            solrTemplate.commit();
        }
    }

    public static void main(String[] args) {
        ApplicationContext contexnt =
                new ClassPathXmlApplicationContext("classpath*:spring/applicationContext*.xml");
        DataImportToSolr bean = (DataImportToSolr)contexnt.getBean("dataImportToSolr");
        bean.importItemDataToSolr();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM