Elastic Search

https://www.bilibili.com/video/av21943111/?spm_id_from=333.788.videocard.3node

Elastic Search 簡稱ES,支持PB級的結構化或者非結構化數據處理;mysql

(一)ES 單實例的安裝web

1. 下載連接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gzsql

2.tar -zxvf 解壓下載的tar.gz 包數據庫

3.進入解壓後的elasticsearch目錄中,進入bin 目錄npm

4. ./elasticsearch  啓動 默認端口9200json

 

安裝插件head 提供友好的web 界面(須要node 環境>6.0):api

1.GitHub 查找 elasticsearch-head  進行下載跨域

2.進入解壓後的目錄 執行 npm install服務器

3.修改elasticsearch 安裝目錄下 config目錄 下的  elasticsearch.yml

4.添加跨域請求配置:

 

http.cors.enabled: true
http.cors.allow-origin: "*"

 

5.npm run start 啓動head 

 ---------至此,單示例的安裝就算完成了

(二)ES 集羣部署的安裝:

集羣部署的安裝主要是操做config 目錄下的 elasticsearch.yml 文件

咱們首先看master 的配置:

#配置cluster 名字
cluster.name: iscys
#節點的名字
node.name: master
#代表當前的節點是master
node.master: true
#綁定的端口,默認9200
network.host: 127.0.0.1

咱們看slave 的配置:

#名字要與主節點一致(集羣這個名字都要一致)
cluster.name: iscys
#節點的名字 node.name: slave network.host:
127.0.0.1

#端口 http.port: 8200
#用於發現主節點
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

 

****注意:在Linux 中安裝運行,必須是非root 用戶而且文件夾所屬也是該用戶,使用chown 進行文件所屬的修改

  常見報錯解決方案:

  http://blog.itpub.net/15498/viewspace-2149328/

 

 

Elastic Search  索引是反向索引又叫倒排索引,根據文章內容中關鍵字進行創建索引

主要要了解索引 類型 文檔 這三個模型概念

索引是用於存放數據的地方,能夠用來理解爲mysql中的一個數據庫

類型是用於定義數據結構的,能夠理解爲mysql 的一張表,類型咱們能夠經過Mapping 來定義每一個字斷的類型

文檔就說最終的數據

 

-----

API 基本格式:

http://<ip>:<port>/<索引>/<類型>/<文檔ID>

使用postman進行索引類型的建立 put 請求   127.0.0.1:9200/book

{
    "settings":{
        "number_of_shards": 3,//分片數
        "number_of_replicas":1//副本數
    }
    ,
    "mappings":{
        "books" :{
            "properties":{
                "id":{
                    "type":"integer"//in t
                },
                "name":{
                    "type":"text"
                },
                "author":{
                    "type":"text"
                },
                "country":{
                    "type":"keyword"//改字段不會被切分
                },
                "date":{
                    "type":"date",
                    "format":"yyyy-MM-dd||epoch_millis"
                }
            }
        }
    }
}

通過上面操做就會在es 中添加book的索引以及索引類型的映射books;

 

Rest API 操做(基於SpringBoot):

pom 文件:

 

 <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.5.2</version>
        </dependency>

 

2.配置client 端:

 @Bean
    public TransportClient esClient(){
        InetSocketTransportAddress address =new
                InetSocketTransportAddress(new InetSocketAddress("127.0.0.1",9300));
        Settings settings =Settings.builder().put("cluster.name","iscys").build();
            TransportClient client = new PreBuiltTransportClient(settings);
            client.addTransportAddress(address);
            return client;
    }

 

3.構造添加es 文檔信息api: 返回文檔惟一ID

     Books books =new Books();
        books.setAuthor("iscys");
        books.setCountry("運城");
        books.setDate(new Date().getTime());
        books.setId(2);
        books.setName("武俠小說");
        byte[] bytes = bi.writeValueAsBytes(books);
        IndexResponse indexResponse = client.prepareIndex("book", "books").setSource(bytes, XContentType.JSON).get();
        String id = indexResponse.getId();
        System.out.println(id);

4.查詢這個是重點,須要一步一步的挖掘:->具體請看--->http://www.javashuo.com/article/p-tbzuoeug-a.html

查詢主要使用的是  QueryBuilders 進行構建查詢器,而後指定索引以及類型進行查詢

(1).  查詢全部的文檔(match_all):

 //預查詢指定索引
        SearchRequestBuilder search = client.prepareSearch("book");
        //構建一個匹配全部的文檔的查詢器
        MatchAllQueryBuilder match_all = QueryBuilders.matchAllQuery();
        System.out.println(match_all);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(match_all)//指定查詢器
                .get();
        System.out.println(books.toString());

咱們經過打印能夠看到match_all其向服務器發送的json 以下:

{
  "match_all" : {
    "boost" : 1.0
  }
}

 (2).  查詢指定字段的文檔(match 模糊匹配)

//預查詢指定索引
        SearchRequestBuilder search = client.prepareSearch("book");
        //構建一個匹配指定字段的選擇器 name 字段(field) 內容是陳
        MatchQueryBuilder match = QueryBuilders.matchQuery("name", "陳");
        System.out.println(match);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(match)//指定查詢器
                .get();
        System.out.println(books.toString());

咱們經過打印能夠看到match_all其向服務器發送的json 以下:

{
  "match" : {
    "name" : {
      "query" : "陳",
      "operator" : "OR",
      "prefix_length" : 0,
      "max_expansions" : 50,
      "fuzzy_transpositions" : true,
      "lenient" : false,
      "zero_terms_query" : "NONE",
      "boost" : 1.0
    }
  }
}

 (3).  (phrase)習語匹配  按短語查詢,只有存在這個短語的文檔纔會被顯示出來。

//預查詢指定索引
        SearchRequestBuilder search = client.prepareSearch("book");
        //構建一個匹配指定字段的選擇器 name 字段(field) 內容是陳
        MatchPhraseQueryBuilder phrase = QueryBuilders.matchPhraseQuery("name", "c陳");
        System.out.println(phrase);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(phrase)//指定查詢器
                .get();
        System.out.println(books.toString());

咱們經過打印能夠看到match_all其向服務器發送的json 以下:

{
  "match_phrase" : {
    "name" : {
      "query" : "c陳",
      "slop" : 0,
      "boost" : 1.0
    }
  }
}

(4).  (multiMatch)多字段模糊匹配查詢

        //預查詢指定索引
        SearchRequestBuilder search = client.prepareSearch("book");
        //構建一個多字段模糊匹配multiMatchQuery
        MultiMatchQueryBuilder multi = QueryBuilders.multiMatchQuery("c陳好", "name", "author");
        System.out.println(multi);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(multi)//指定查詢器
                .get();
        System.out.println(books.toString());
        //client.prepareDelete("book","books","AWwO0p5geq2bqnybBzqr").get();

咱們經過打印能夠看到match_all其向服務器發送的json 以下:

{
  "multi_match" : {
    "query" : "c陳好",
    "fields" : [
      "author^1.0",
      "name^1.0"
    ],
    "type" : "best_fields",
    "operator" : "OR",
    "slop" : 0,
    "prefix_length" : 0,
    "max_expansions" : 50,
    "lenient" : false,
    "zero_terms_query" : "NONE",
    "boost" : 1.0
  }
}

 (5). (term 查詢)結構化查詢,term是將傳入的文本原封不動地(不分詞)拿去查詢。

        //預查詢指定索引
        SearchRequestBuilder search = client.prepareSearch("book");
        //構建一個term 查詢
        TermQueryBuilder term = QueryBuilders.termQuery("id", 1);
        System.out.println(term);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(term)//指定查詢器
                .get();
        System.out.println(books.toString());

咱們經過打印能夠看到match_all其向服務器發送的json 以下:

{
  "term" : {
    "id" : {
      "value" : 1,
      "boost" : 1.0
    }
  }
}

 (6) 複合查詢,多種條件的集合

布爾查詢:

 

  SearchRequestBuilder search =client.prepareSearch("book");
        //bool 查詢
        BoolQueryBuilder bool = QueryBuilders.boolQuery();
        //篩選
        bool.must(QueryBuilders.multiMatchQuery("c","author","name"));
        bool.must(QueryBuilders.matchQuery("date",1563640592899l));
        //過濾
        bool.filter(QueryBuilders.termQuery("date","156364059289"));
        System.out.println(bool);
        SearchResponse books = search
                .setTypes("books")
                .setQuery(bool)//指定查詢器
                .get();
        System.out.println(books.toString());

 

打印發送的json 以下:

{
  "bool" : {
    "must" : [
      {
        "multi_match" : {
          "query" : "c",
          "fields" : [
            "author^1.0",
            "name^1.0"
          ],
          "type" : "best_fields",
          "operator" : "OR",
          "slop" : 0,
          "prefix_length" : 0,
          "max_expansions" : 50,
          "lenient" : false,
          "zero_terms_query" : "NONE",
          "boost" : 1.0
        }
      },
      {
        "match" : {
          "date" : {
            "query" : 1563640592899,
            "operator" : "OR",
            "prefix_length" : 0,
            "max_expansions" : 50,
            "fuzzy_transpositions" : true,
            "lenient" : false,
            "zero_terms_query" : "NONE",
            "boost" : 1.0
          }
        }
      }
    ],
    "filter" : [
      {
        "term" : {
          "date" : {
            "value" : "156364059289",
            "boost" : 1.0
          }
        }
      }
    ],
    "disable_coord" : false,
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}
相關文章
相關標籤/搜索