搜索學(xué)習(xí)--Solr全文搜索服務(wù)器的基本使用(二)——Spring Data Solr的使用

在上一篇搜索學(xué)習(xí)--Solr全文搜索服務(wù)器的基本使用(一)——SolrJ的使用中,我是直接使用的SolrJ來調(diào)用Solr服務(wù)器的访得,而對(duì)于熟悉Spring Data系列的同學(xué)一定更希望用這種規(guī)范的方式去操作它震鹉。Spring Data是支持Solr的,只需要簡(jiǎn)單的配置传趾,我們即可像操作數(shù)據(jù)庫(kù)一樣操作它浆兰。

依賴

     <properties>
        <spring-version>4.2.3.RELEASE</spring-version>
     </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</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-context</artifactId>
            <version>${spring-version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

Spring配置 spring-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:context="http://www.springframework.org/schema/context"
       xmlns:solr="http://www.springframework.org/schema/data/solr"
       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 http://www.springframework.org/schema/data/solr http://www.springframework.org/schema/data/solr/spring-solr.xsd">


    <solr:solr-server id="solrServer" url="http://127.0.0.1:8983/solr/blog" timeout="5000" maxConnections="10"></solr:solr-server>
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate" scope="singleton">
        <constructor-arg ref="solrServer"/>
    </bean>

    <solr:repositories base-package="top.yuyufeng.learn.lucene.solr"/>

</beans>

BlogCore.java

package top.yuyufeng.learn.lucene.solr;
/**
 * @author yuyufeng
 * @date 2017/12/6
 */

import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.Indexed;
import org.springframework.data.solr.core.mapping.SolrDocument;

import java.util.Date;

/**
 * @author yuyufeng
 */
@SolrDocument(solrCoreName = "blog")
public class BlogCore {
    @Id
    @Indexed
    public Long blogId;
    @Indexed
    public String blogTitle;
    @Indexed
    public String blogContent;
    @Indexed
    public Date createTime;
    @Indexed
    public String keywords;

    public Long getBlogId() {
        return blogId;
    }

    public void setBlogId(Long blogId) {
        this.blogId = blogId;
    }

    public String getBlogTitle() {
        return blogTitle;
    }

    public void setBlogTitle(String blogTitle) {
        this.blogTitle = blogTitle;
    }

    public String getBlogContent() {
        return blogContent;
    }

    public void setBlogContent(String blogContent) {
        this.blogContent = blogContent;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getKeywords() {
        return keywords;
    }

    public void setKeywords(String keywords) {
        this.keywords = keywords;
    }

    @Override
    public String toString() {
        return "BlogCore{" +
                "blogId=" + blogId +
                ", blogTitle='" + blogTitle + '\'' +
                ", blogContent='" + blogContent + '\'' +
                ", createTime=" + createTime +
                ", keywords='" + keywords + '\'' +
                '}';
    }
}

BlogCoreRepository.java

package top.yuyufeng.learn.lucene.solr;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.data.solr.repository.Highlight;
import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;

/**
 * @author yuyufeng
 */
public interface BlogCoreRepository extends SolrCrudRepository<BlogCore, Long> {
    /**
     * 搜索所有   //(value = "*:*", filters = {"title北京市"})
     * @param page
     * @return
     */
    @Override
    @Query(value = "*:*")
    Page<BlogCore> findAll(Pageable page);

    /**
     * 通過關(guān)鍵詞搜索
     * @param keywords
     * @param page
     * @return
     */
    @Highlight(prefix = "<B>", postfix = "</B>")
    HighlightPage<BlogCore> findByKeywords(String keywords, Pageable page);
}

測(cè)試使用

package top.yuyufeng.learn.lucene.solr;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.solr.core.query.result.HighlightEntry;
import org.springframework.data.solr.core.query.result.HighlightPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-solr.xml"})
public class BlogCoreTest {
    @Autowired
    private BlogCoreRepository blogCoreRepository;

    @Test
    public void testFindByKeywords() {
        Pageable pageable = new PageRequest(0, 10);
        HighlightPage<BlogCore> highlightPage = blogCoreRepository.findByKeywords("達(dá)摩院", pageable);
        for (int i = 0; i < highlightPage.getHighlighted().size(); i++) {
            BlogCore blogCore = highlightPage.getHighlighted().get(i).getEntity();
            for (HighlightEntry.Highlight highlight : highlightPage.getHighlighted().get(i).getHighlights()) {
                if ("blogTitle".equals(highlight.getField().getName())) {
                    blogCore.setBlogTitle(highlight.getSnipplets().get(0));
                } else if ("blogContent".equals(highlight.getField().getName())) {
                    blogCore.setBlogContent(highlight.getSnipplets().get(0));
                }
            }
            System.out.println(blogCore);
        }
    }

}

運(yùn)行結(jié)果:

BlogCore{blogId=2, blogTitle='<B>達(dá)摩</B><B>院</B>超越業(yè)界龍頭', blogContent='<B>達(dá)摩</B><B>院</B>一定也必須要超越英特爾劫恒,必須超越微軟轿腺,必須超越IBM,因?yàn)槲覀兩诙皇兰o(jì)族壳,我們是有機(jī)會(huì)后發(fā)優(yōu)勢(shì)的。', createTime=Wed Dec 06 13:38:12 CST 2017, keywords='null'}
BlogCore{blogId=1, blogTitle='馬云表達(dá)愿景', blogContent='10月11日杭州云棲大會(huì)上贰您,馬云表達(dá)了對(duì)新建成的阿里巴巴全球研究<B>院</B>—阿里巴巴<B>達(dá)摩</B><B>院</B>的愿景拢操,希望<B>達(dá)摩</B><B>院</B>二十年內(nèi)成為世界第一大經(jīng)濟(jì)體,服務(wù)世界二十億人孽亲,創(chuàng)造一億個(gè)工作崗位展父。', createTime=Wed Dec 06 12:03:56 CST 2017, keywords='null'}

備注

之前已經(jīng)建立索引,這里就直接搜索keywords了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篮绿,一起剝皮案震驚了整個(gè)濱河市吕漂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吼虎,老刑警劉巖苍鲜,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洒疚,居然都是意外死亡坯屿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門乏德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吠昭,“玉大人怎诫,你說我怎么就攤上這事』眉耍” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵强胰,是天一觀的道長(zhǎng)偶洋。 經(jīng)常有香客問我距糖,道長(zhǎng)牵寺,這世上最難降的妖魔是什么恩脂? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮黎休,結(jié)果婚禮上玉凯,老公的妹妹穿的比我還像新娘。我一直安慰自己漫仆,他們只是感情好歹啼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藤树,像睡著了一般拓萌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屡限,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天炕倘,我揣著相機(jī)與錄音,去河邊找鬼啊央。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涨醋,可吹牛的內(nèi)容都是我干的瓜饥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼浴骂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乓土!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤趣苏,失蹤者是張志新(化名)和其女友劉穎狡相,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拦键,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谣光,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年芬为,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟀悦。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡媚朦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出日戈,到底是詐尸還是另有隱情询张,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布浙炼,位于F島的核電站份氧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弯屈。R本人自食惡果不足惜蜗帜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望资厉。 院中可真熱鬧厅缺,春花似錦、人聲如沸宴偿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窄刘。三九已至窥妇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娩践,已是汗流浹背活翩。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欺矫,地道東北人纱新。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像穆趴,于是被迫代替她去往敵國(guó)和親脸爱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 這本書——咳咳未妹,暫且不要臉的稱為一本書簿废,這本書誕生在寒冬 算的上是一本故事集吧空入,四個(gè)故事四種遭遇四種精神!每個(gè)故事...
    心靈鋪?zhàn)?/span>閱讀 256評(píng)論 0 1
  • 本草綱目,藏在草木的夢(mèng)里(四) 注:文章中草藥療效皆自《本草綱目》单料,僅供創(chuàng)作參考埋凯,不具備現(xiàn)實(shí)功效。 草部.人參 人...
    貴鬼先生閱讀 3,231評(píng)論 16 30
  • 遠(yuǎn)看水無痕 近看漣漪連 葉葉相交露瑩瑩 蜻蜓似絮落落飛 水中草 楊柳影 絕勝紅塵滿歸寄
    段干魂陰閱讀 144評(píng)論 0 0