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

作為一般的Lucene使用者,我們直接用Lucene雖然可以實(shí)現(xiàn)很多自己想要的自定義功能曲秉,但是對(duì)于一般的項(xiàng)目,為了方便開(kāi)發(fā)和維護(hù)歧譬,我們通常會(huì)使用現(xiàn)成的搜索服務(wù)器“痘耄現(xiàn)在常用的有SolrElasticSearch
對(duì)于Solr服務(wù)器如何搭建瑰步,Solr服務(wù)器的搭建矢洲,之前已經(jīng)整理過(guò),這次缩焦,我將使用SolrJ來(lái)調(diào)用Solr服務(wù)器读虏。

在Solr中配置Core

在managed-schema中,主要的配置為:

<uniqueKey>blogId</uniqueKey>
<field name="blogId" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="blogTitle" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="blogContent" type="text_ik" indexed="true" stored="true" required="true" multiValued="false" /> 
<field name="createTime" type="date" indexed="false" stored="true" required="true" multiValued="false" /> 
<field name="keywords" type="text_ik" indexed="true" stored="false"  multiValued="true"/> 
<copyField source="blogTitle" dest="keywords"/>
<copyField source="blogContent" dest="keywords"/>
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false"
                class="org.wltea.analyzer.lucene.IKAnalyzer" />
<analyzer type="query" useSmart="true"
                class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>

依賴(lài)

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>6.5.1</version>
</dependency>

SolrServer.Java

package top.yuyufeng.learn.lucene.solr;

import org.apache.solr.client.solrj.impl.HttpSolrClient;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
public class SolrServer {
    private static HttpSolrClient server = null;
    private final static String solrServerUrl = "http://127.0.0.1:8983/solr/blog";

    public static HttpSolrClient getServer() {
        if (server == null) {
            server = new HttpSolrClient(solrServerUrl);
            server.setDefaultMaxConnectionsPerHost(1000);
            server.setMaxTotalConnections(10000);//最大連接數(shù)
            server.setConnectionTimeout(60000);//設(shè)置連接超時(shí)時(shí)間(單位毫秒) 1000
            server.setSoTimeout(60000);//// 設(shè)置讀數(shù)據(jù)超時(shí)時(shí)間(單位毫秒) 1000
            server.setFollowRedirects(false);//遵循從定向
            server.setAllowCompression(true);//允許壓縮
        }
        return server;
    }

    public static void main(String[] args) {
        HttpSolrClient client = getServer();
        System.out.println(client);
    }
}

BlogCore.java

package top.yuyufeng.learn.lucene.solr.core;

import org.apache.solr.client.solrj.beans.Field;

import java.util.Date;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
public class BlogCore {
    @Field
    private String blogId;
    @Field
    private String blogTitle;
    @Field
    private String blogContent;
    @Field
    private Date createTime;
    @Field
    private String keywords;

    public String getBlogId() {
        return blogId;
    }

    public void setBlogId(String 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 + '\'' +
                '}';
    }
}

BlogSolrDao.java

package top.yuyufeng.learn.lucene.solr.dao;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.UpdateResponse;
import top.yuyufeng.learn.lucene.solr.SolrServer;
import top.yuyufeng.learn.lucene.solr.core.BlogCore;

import java.awt.print.Pageable;
import java.util.List;
import java.util.Map;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
public class BlogSolrDao{
    HttpSolrClient server;

    public BlogSolrDao() {
        server = SolrServer.getServer();
    }

    /**
     * 按Bean  添加/修改 索引
     *
     * @throws Exception
     */
    public int addIndex(BlogCore entity) throws Exception {
        server.addBean(entity);
        UpdateResponse updateResponse = server.commit();
        return updateResponse.getStatus();
    }


    /**
     * 按Bean  添加/修改 索引
     *
     * @throws Exception
     */
    public int addIndexList(List<BlogCore> entitys) throws Exception {
        server.addBeans(entitys);
        UpdateResponse updateResponse = server.commit();
        return updateResponse.getStatus();

    }

    /**
     * 刪除索引 按查詢(xún)
     *
     * @throws Exception
     */
    public int deleteAll() throws Exception {
        String query = "*:*";
        server.deleteByQuery(query);
        server.commit();
        UpdateResponse updateResponse = server.commit();
        return updateResponse.getStatus();
    }

    /**
     * 刪除索引 按id
     *
     * @throws Exception
     */
    public int deleteByQuery(Long id) throws Exception {
        server.deleteById(id + "");
        server.commit();
        UpdateResponse updateResponse = server.commit();
        return updateResponse.getStatus();
    }

    //查詢(xún)所有
    public List<BlogCore> query() throws Exception {
        SolrQuery query = new SolrQuery();
        query.setQuery("*:*");
        query.setStart(0);//開(kāi)始記錄數(shù)
        query.setRows(10000);//總條數(shù)
        QueryResponse queryResponse = server.query(query);
        List<BlogCore> results = queryResponse.getBeans(BlogCore.class);
        return results;
    }


    //搜索keywords
    public  List<BlogCore> queryByKeyWords(String keywords) throws Exception {

        SolrQuery query = new SolrQuery();
        query.set("q", "keywords:" + keywords);//*通配多個(gè)字符
//        query.set("sort", "product_price desc");
        //======高亮設(shè)置===
        //開(kāi)啟高亮
        query.setHighlight(true);
        //高亮域
        query.addHighlightField("blogContent");
        query.addHighlightField("blogTitle");
        //前綴
        query.setHighlightSimplePre("<B>");
        //后綴
        query.setHighlightSimplePost("</B>");
        //query.setHighlightSnippets(1);//結(jié)果分片數(shù)袁滥,默認(rèn)為1
        //query.setHighlightFragsize(1000);//每個(gè)分片的最大長(zhǎng)度盖桥,默認(rèn)為100

        query.setStart(0);//開(kāi)始記錄數(shù)
        query.setRows(100);//總條數(shù)
        QueryResponse queryResponse = server.query(query);
        long sum = queryResponse.getResults().getNumFound();
        List<BlogCore> results = queryResponse.getBeans(BlogCore.class);
        //輸出高亮
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();

        for (BlogCore result : results) {
            Map<String, List<String>> map = highlighting.get(result.getBlogId()+"");
            List<String> list = map.get("blogTitle");
            if (list != null && list.size() > 0) {
                result.setBlogTitle(list.get(0));
            }
            list = map.get("blogContent");
            if (list != null && list.size() > 0) {
                result.setBlogContent(list.get(0));
            }
        }
       return results;
    }
}

SolrTest.java

package top.yuyufeng.learn.lucene.solr;

import org.junit.Test;
import top.yuyufeng.learn.lucene.solr.core.BlogCore;
import top.yuyufeng.learn.lucene.solr.dao.BlogSolrDao;

import java.util.Date;
import java.util.List;

/**
 * @author yuyufeng
 * @date 2017/12/6
 */
public class SolrTest {

    @Test
    public void testIndex() throws Exception {
        BlogSolrDao blogSolrDao = new BlogSolrDao();
        BlogCore blog = new BlogCore();
        blog.setBlogId("2");
        blog.setBlogTitle("達(dá)摩院超越業(yè)界龍頭");
        blog.setBlogContent("達(dá)摩院一定也必須要超越英特爾,必須超越微軟题翻,必須超越IBM揩徊,因?yàn)槲覀兩诙皇兰o(jì),我們是有機(jī)會(huì)后發(fā)優(yōu)勢(shì)的。");
        blog.setCreateTime(new Date());
        blogSolrDao.addIndex(blog);
    }

    @Test
    public void testFindAll() throws Exception {
        BlogSolrDao blogSolrDao = new BlogSolrDao();
        List<BlogCore> list = blogSolrDao.query();
        for (BlogCore blogCore : list) {
            System.out.println(blogCore);
        }
    }


    @Test
    public void testSearch() throws Exception {
        BlogSolrDao blogSolrDao = new BlogSolrDao();
        List<BlogCore> list = blogSolrDao.queryByKeyWords("達(dá)摩院");
        for (BlogCore blogCore : list) {
            System.out.println(blogCore);
        }
    }
}

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

啟動(dòng)Solr服務(wù)器后塑荒,我建立了一些索引熄赡,然后我執(zhí)行Search方法

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'}
?著作權(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)離奇詭異腰涧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)紊浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)窖铡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坊谁,你說(shuō)我怎么就攤上這事费彼。” “怎么了口芍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵箍铲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鬓椭,道長(zhǎng)颠猴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任小染,我火速辦了婚禮翘瓮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裤翩。我一直安慰自己资盅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著呵扛,像睡著了一般振峻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上择份,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天扣孟,我揣著相機(jī)與錄音,去河邊找鬼荣赶。 笑死凤价,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拔创。 我是一名探鬼主播利诺,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剩燥!你這毒婦竟也來(lái)了慢逾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灭红,失蹤者是張志新(化名)和其女友劉穎侣滩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一账阻、第九天 我趴在偏房一處隱蔽的房頂上張望蒂秘。 院中可真熱鬧,春花似錦淘太、人聲如沸姻僧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撇贺。三九已至赌莺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間松嘶,已是汗流浹背艘狭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(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)容

  • 多少年前的今天 你結(jié)束了陽(yáng)光的纏綿 黑夜越走越長(zhǎng) 人間的溫暖也悄悄變淡 是誰(shuí)埋沒(méi)了花草的絢爛 把一顆顆星辰淹沒(méi)在塵...
    壟上行云閱讀 163評(píng)論 6 2
  • 以前聽(tīng)別人說(shuō)自然療法的時(shí)候似谁,我覺(jué)得特別特別神奇傲绣,以為就跟中醫(yī)一樣,是單獨(dú)的一套研究理論巩踏,后來(lái)才知道這自然療法包含太...
    心作閱讀 574評(píng)論 0 0
  • 日精進(jìn):"來(lái)日方長(zhǎng)并不長(zhǎng)"我們經(jīng)常的口頭禪就是"等我有空了就如何如何…回頭想想自己做了幾件承諾過(guò)給家人的事秃诵? 精進(jìn)...
    胡玉梅閱讀 157評(píng)論 0 0
  • 一顷链、大盤(pán)、板塊 419魔咒遲到了一天屈梁,三大指數(shù)齊齊下挫,盤(pán)面除了芯片一枝獨(dú)秀幾乎沒(méi)法看榛了。超級(jí)品牌表現(xiàn)還算是比較抗跌...
    跟著鵬叔游世界閱讀 319評(píng)論 0 1