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

Elastic Search 简称ES,支持PB级的结构化或者非结构化数据处理;

(一)ES 单实例的安装

1. 下载链接:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.tar.gz

2.tar -zxvf 解压下载的tar.gz 包

3.进入解压后的elasticsearch目录中,进入bin 目录

4. ./elasticsearch  启动 默认端口9200

 

安装插件head 提供友好的web 界面(需要node 环境>6.0):

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.查询这个是重点,需要一步一步的挖掘:->具体请看--->https://juejin.im/post/5b7fe4a46fb9a019d92469a9#heading-17

查询主要使用的是  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
  }
}

 

posted on 2018-11-14 19:47  iscys  阅读(421)  评论(1编辑  收藏  举报