Java日記——使用強(qiáng)大的Elastisearch搜索引擎

Elastisearch是一個(gè)很強(qiáng)大,易用的搜索引擎
在系統(tǒng)上運(yùn)行Elastisearch只需以下幾步

1.下載Elastisearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.zip

2.解壓

unzip elasticsearch-5.4.0.zip

3.運(yùn)行

elasticsearch-5.4.0/bin/elasticsearch

這時(shí)有可能會(huì)直接被Killed掉瘦赫,因?yàn)閮?nèi)存溢出(OOM)赦肋,elastisearch占用的內(nèi)存非常大,所以在內(nèi)存比較小的服務(wù)器上運(yùn)行要先修改jvm的內(nèi)存大小

vi elasticsearch-5.4.0/config/jvm.options

將22和23行的棧堆大小改為512M

-Xms512M
-Xmx512M

如果重新啟動(dòng)后還是killed就再改小一點(diǎn)

4.測(cè)試是否成功

curl    'http://localhost:9200/?pretty'

你能看到以下返回信息:

{
            "status":   200,
            "name": "Shrunken   Bones",
            "version":  {
                        "number":   "1.4.0",
                        "lucene_version":   "4.10"
            },
            "tagline":  "You    Know,   for Search"
}

則表明啟動(dòng)成功

接下來(lái)我們用Java的API來(lái)操作Elasticsearch

首先是導(dǎo)入elastisearch和log4j的包

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jk</groupId>
    <artifactId>ElasticsearchExample</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <!--用哪個(gè)版本就填什么-->
            <version>5.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.7</version>
        </dependency>
    </dependencies>

</project>

以下是常用的幾種操作

1.創(chuàng)建client

Client client = null;
        try {
            client = new PreBuiltTransportClient(Settings.EMPTY)
                    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
        } catch (Exception e) {
            e.printStackTrace();
        }

2.創(chuàng)建索引

/**
     * 創(chuàng)建索引泰讽,有則先刪除
     * @param client
     */
    private static void recreateIndex(Client client) {
        if (client.admin().indices().prepareExists(index).execute().actionGet()
                .isExists()) {
            DeleteIndexResponse deleteIndexResponse = client.admin().indices()
                    .delete(new DeleteIndexRequest(index)).actionGet();
            System.out.println("delete index :");
            System.out.println(deleteIndexResponse);
        }

        CreateIndexResponse createIndexResponse = client.admin().indices()
                .prepareCreate(index).execute().actionGet();
        System.out.println("create index :");
        System.out.println(createIndexResponse);
    }

3.插入數(shù)據(jù)

/**
     * 插入數(shù)據(jù)
     * @param client
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static void doIndex(final Client client) {
        Map s11 = new LinkedHashMap();
        s11.put("title", "Think in java");
        s11.put("origin", "美國(guó)");
        s11.put("description", "初級(jí)java開(kāi)發(fā)人員必讀的書(shū)");
        s11.put("author", "Bruce Eckel");
        s11.put("price", 108);

        Map s12 = new LinkedHashMap();
        s12.put("title", "Head First Java");
        s12.put("origin", "英國(guó)");
        s12.put("description", "java入門(mén)教材");
        s12.put("author", "Kathy Sierra");
        s12.put("price", 54);

        Map s21 = new LinkedHashMap();
        s21.put("title", "Design Pattern");
        s21.put("origin", "法國(guó)");
        s21.put("description", "程序員不得不讀的設(shè)計(jì)模式");
        s21.put("author", "Kathy Sierra");
        s21.put("price", 89);

        Map s22 = new LinkedHashMap();
        s22.put("title", "黑客與畫(huà)家");
        s22.put("origin", "法國(guó)");
        s22.put("description", "讀完之后腦洞大開(kāi)");
        s22.put("author", "Paul Graham");
        s22.put("price", 35);

        BulkResponse bulkResponse = client
                .prepareBulk()
                .add(client.prepareIndex(index, type).setId("11").setSource(s11).setOpType(IndexRequest.OpType.INDEX).request())
                .add(client.prepareIndex(index, type).setId("12").setSource(s12).setOpType(IndexRequest.OpType.INDEX).request())
                .add(client.prepareIndex(index, type).setId("21").setSource(s21).setOpType(IndexRequest.OpType.INDEX).request())
                .add(client.prepareIndex(index, type).setId("22").setSource(s22).setOpType(IndexRequest.OpType.INDEX).request())
                .execute().actionGet();
        if (bulkResponse.hasFailures()) {
            System.err.println("index docs ERROR:" + bulkResponse.buildFailureMessage());
        } else {
            System.out.println("index docs SUCCESS:");
            System.out.println(bulkResponse);
        }
    }

4.查詢所有

    /**
     * 查詢所有
     */
    private static void searchAll(Client client) {
        SearchResponse response = client.prepareSearch(index)
                .setQuery(QueryBuilders.matchAllQuery())
                .setExplain(true).execute().actionGet();
        System.out.println("searchAll : ");
        for (SearchHit searchHit : response.getHits()) {
            System.out.println("********");
            System.out.println(searchHit.getSource());
        }
    }

5.關(guān)鍵詞查詢

    /**
     * 關(guān)鍵詞查詢
     *
     * @param client
     */
    private static void searchKeyWord(Client client) {
        SearchResponse response = client.prepareSearch(index)
                //查詢所有字段匹配關(guān)鍵字
                .setQuery(QueryBuilders.matchQuery("_all", "法國(guó)"))
                //設(shè)置最小匹配程度
//                .setQuery(QueryBuilders.matchQuery("_all", "法國(guó)").minimumShouldMatch("100%"))
                .execute().actionGet();
        System.out.println("searchKeyWord : ");
        System.out.println(response);
    }

6.數(shù)值范圍過(guò)濾

    /**
     * 數(shù)值范圍過(guò)濾
     *
     * @param client
     */
    private static void searchRange(Client client) {
        SearchResponse response = client.prepareSearch(index).
                //大于80抢韭,小于100
                setQuery(QueryBuilders.rangeQuery("price").gt(80).lt(100))
                .execute()
                .actionGet();
        System.out.println("searchRange : ");
        System.out.println(response);
    }

7.排序

    /**
     * 排序
     *
     * @param client
     */
    private static void searchOrdered(Client client) {
        SearchResponse response = client.prepareSearch(index)
                .setQuery(QueryBuilders.matchAllQuery())
                //根據(jù)價(jià)格降序排序
                .addSort(SortBuilders.fieldSort("price")
                        .order(SortOrder.DESC)).execute().actionGet();
        System.out.println("searchOrdered : ");
        System.out.println(response);
    }

8.高亮關(guān)鍵字

/**
     * 高亮關(guān)鍵字
     * @param client
     */
    private static void searchHightlight(Client client) {
        //高亮多個(gè)字段
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title");
        highlightBuilder.field("description");
        SearchResponse response = client.prepareSearch(index)
                //單條件匹配薪贫,高亮?xí)r只能高亮該字段
//                .setQuery(QueryBuilders.matchQuery("title", "java"))
                //多條件匹配,高亮?xí)r只能高亮多個(gè)字段
                .setQuery(QueryBuilders.multiMatchQuery("開(kāi)發(fā)人員必讀", "title", "description"))
                .highlighter(highlightBuilder)
                .execute()
                .actionGet();
        System.out.println("searchHightlight : ");
        System.out.println(response);
    }

9.根據(jù)id查找

    /**
     * 根據(jù)id查找
     * @param client
     */
    private static void findById(final Client client) {
        String id="12";
        GetResponse response = client.prepareGet(index, type, id).get();
        System.out.println("findById");
        System.out.println(response);
    }

10.刪除

     /**
     * 刪除
     * @param client
     */
    private static void deleteById(Client client) {
        String id="12";
        DeleteResponse response = client.prepareDelete(index, type, id).get();
    }

11.更新

    /**
     * 更新
     * @param client
     */
    private static void updateById(Client client) {
        try {
            String id="11";
            client.prepareUpdate(index, type, id)
                    .setDoc(jsonBuilder()
                            .startObject()
                            .field("title", "白鹿原")
                            .endObject())
                    .get();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

常用的操作就這些,代碼上傳到https://github.com/jkgeekJack/ElasticsearchExample

建議大家還可以看看Elasticsearch: 權(quán)威指南,這里有更詳細(xì)的介紹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻恭,一起剝皮案震驚了整個(gè)濱河市瞧省,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鳍贾,老刑警劉巖鞍匾,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異骑科,居然都是意外死亡橡淑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)咆爽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梁棠,“玉大人置森,你說(shuō)我怎么就攤上這事£瑁” “怎么了暇藏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蜜笤,是天一觀的道長(zhǎng)濒蒋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)把兔,這世上最難降的妖魔是什么沪伙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮县好,結(jié)果婚禮上围橡,老公的妹妹穿的比我還像新娘。我一直安慰自己缕贡,他們只是感情好翁授,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著晾咪,像睡著了一般收擦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谍倦,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天塞赂,我揣著相機(jī)與錄音,去河邊找鬼昼蛀。 笑死宴猾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叼旋。 我是一名探鬼主播仇哆,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夫植!你這毒婦竟也來(lái)了讹剔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偷崩,失蹤者是張志新(化名)和其女友劉穎辟拷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阐斜,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衫冻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谒出。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隅俘。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邻奠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出为居,到底是詐尸還是另有隱情碌宴,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布蒙畴,位于F島的核電站贰镣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膳凝。R本人自食惡果不足惜碑隆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹬音。 院中可真熱鬧上煤,春花似錦、人聲如沸著淆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)永部。三九已至独泞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扬舒,已是汗流浹背阐肤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讲坎,地道東北人孕惜。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晨炕,于是被迫代替她去往敵國(guó)和親衫画。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 之前的文章一直在規(guī)避索引的建立去優(yōu)化數(shù)據(jù)庫(kù),不是不想講费奸,而是這個(gè)太重要弥激,必須抽出來(lái)講。今天我們就來(lái)研究下數(shù)據(jù)庫(kù)索引...
    JackFrost_fuzhu閱讀 4,744評(píng)論 0 70
  • Solr&ElasticSearch原理及應(yīng)用 一愿阐、綜述 搜索 http://baike.baidu.com/it...
    樓外樓V閱讀 7,305評(píng)論 1 17
  • 總結(jié)篇 今天是共讀《時(shí)間管理手賬》第五天微服。 昨天到今天我十個(gè)月大的寶寶生病發(fā)燒了,我所有的生活計(jì)劃就更亂了缨历。 我變...
    Lucky幸運(yùn)草閱讀 166評(píng)論 0 0
  • 俗話說(shuō)以蕴,秦檜還有三個(gè)摯友糙麦。不管文小全在七大姑八大姨眼里如何如何,她也還是有幾個(gè)不錯(cuò)的朋友丛肮,哈哈赡磅,真值得驕傲。 對(duì)于...
    李西柚李閱讀 245評(píng)論 0 0
  • 昨天晚上去操場(chǎng)跑步的時(shí)候宝与,一個(gè)女生坐在一個(gè)角落將頭埋在身體里焚廊,打著電話哭喊著說(shuō)“全世界我能想到的只有你,可是你這個(gè)...
    思想的舵手閱讀 577評(píng)論 0 9