elasticsearch

ElasticSerrch

概述

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

简介

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。

Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。

Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务

安装

以windows操作系统和ES0.19.7版本为例:

网址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-9-0

①下载elasticsearch-6.4.1.zip

②直接解压至某目录,设置该目录为ES_HOME[环境变量](https://baike.baidu.com/item/环境变量

③安装JDK,并设置JAVA_HOME环境变量

④在windows下,运行 %ES_HOME%\bin\elasticsearch.bat即可运行

以head插件为例:

联网时,直接运行%ES_HOME%\bin\plugin --install mobz/elasticsearch-head。

不联网时,下载elasticsearch-head的zipball的master包,然后运行%ES_HOME%\bin\plugin --url file:///[path-to-downloadfile] --install head,其中[path-to-downloadfile]是下载后master包的绝对路径。

安装完成,重启服务,在浏览器打开 http://localhost:9200/_plugin/head/ 即可。

启动:ElasticSerrch服务,双击elasticsearch.bat即可

修改密码:

1.在yml的最低下加上

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

2.切换到ElasticSerrch的bin目录

3.elasticsearch-setup-passwords interactive

4.y

5.输入密码

注意:密码是看不见的,自己要记住

代码实现

注意:此期间ElasticSerrch的服务要开著

1.引入pom依赖 elasticsearch

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
 </dependency>

2.配置连接的参数

@Configuration
public class ElasticSearchConfig {
    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        //无密码
        //RestClientBuilder builder = RestClient.builder(new HttpHost("localhost",9200,"http"));
        //return new RestHighLevelClient(builder);

        //须要用户名和密码的认证
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("localhost", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
                        return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });
        return new RestHighLevelClient(restClientBuilder);
    }
}

3.编写一个操作的对象

@Data
@Document(indexName = "eshop",indexStoreType = "product")
public class Product {
    @Id
    private String pid;
    private String pname;
    private double pprice;
}

4.编写接口类继承ElasticsearchRepository

public interface ProductDao extends ElasticsearchRepository<Product,String> {
}

5.控制层的CRUD

@RestController
@RequestMapping
public class ProController {
    @Autowired
    private ProductDao product;

    @RequestMapping("/save")
    public String savePro() {
        Product product1 = new Product();
        product1.setPid("101");
        product1.setPname("辣条");
        product1.setPprice(6.00);
        Product product2 = new Product();
        product2.setPid("102");
        product2.setPname("饮料");
        product2.setPprice(3.00);
        product.save(product1);
        product.save(product2);
        return "存储成功!!!";
    }

    @RequestMapping("/find")
    public Object search01(String pid) {
        //QueryBuilders的matchQuery方法进行匹配,可以自定义匹配规则
        QueryBuilder queryBuilders = QueryBuilders.matchQuery("pid", pid);
        //调用elasticsearch的方法进行搜索
        Iterable<Product> iter = product.search(queryBuilders);
        return iter;
    }
    @RequestMapping("/find2")
    public Object search02() {
        Optional<Product> byId = product.findById("102");
        Product product = byId.get();
        System.out.println(product);

        return "666";
    }
    @RequestMapping("/find3")
    public Object search03() {
        Iterator<Product> iterator = product.findAll().iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        return "666";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值