elasticsearch 订阅
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。 展开全文
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
信息
技术支持
通过HTTP使用JSON进行数据索引
简    称
ES
主要目的
解决人们对于搜索的众多要求
用    途
用于分布式全文检索
外文名
Elasticsearch
elasticsearch简介
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。”Elasticsearch是分布式的,这意味着索引可以被分成分片,每个分片可以有0个或多个副本。每个节点托管一个或多个分片,并充当协调器将操作委托给正确的分片。再平衡和路由是自动完成的。“相关数据通常存储在同一个索引中,该索引由一个或多个主分片和零个或多个复制分片组成。一旦创建了索引,就不能更改主分片的数量。Elasticsearch使用Lucene,并试图通过JSON和Java API提供其所有特性。它支持facetting和percolating,如果新文档与注册查询匹配,这对于通知非常有用。另一个特性称为“网关”,处理索引的长期持久性;例如,在服务器崩溃的情况下,可以从网关恢复索引。Elasticsearch支持实时GET请求,适合作为NoSQL数据存储,但缺少分布式事务。 [1] 
收起全文
精华内容
参与话题
问答
  • Elasticsearch配置文件(elasticsearch.yml)详解

    万次阅读 多人点赞 2019-07-31 19:26:52
    ##################### Elasticsearch Configuration Example ##################### # # 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了! # https://www.elastic.co/g...

     原文地址:https://my.oschina.net/Yumikio/blog/805877

    ##################### Elasticsearch Configuration Example ##################### 
    #
    # 只是挑些重要的配置选项进行注释,其实自带的已经有非常细致的英文注释了!
    # https://www.elastic.co/guide/en/elasticsearch/reference/current/modules.html
    #
    ################################### Cluster ################################### 
    # 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的. 
    # es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。 
    # cluster.name可以确定你的集群名称,当你的elasticsearch集群在同一个网段中elasticsearch会自动的找到具有相同cluster.name的elasticsearch服务. 
    # 所以当同一个网段具有多个elasticsearch集群时cluster.name就成为同一个集群的标识. 
    
    # cluster.name: elasticsearch 
    
    #################################### Node ##################################### 
    # https://www.elastic.co/guide/en/elasticsearch/reference/5.1/modules-node.html#master-node
    # 节点名称同理,可自动生成也可手动配置. 
    # node.name: node-1
    
    # 允许一个节点是否可以成为一个master节点,es是默认集群中的第一台机器为master,如果这台机器停止就会重新选举master. 
    # node.master: true 
    
    # 允许该节点存储数据(默认开启) 
    # node.data: true 
    
    # 配置文件中给出了三种配置高性能集群拓扑结构的模式,如下: 
    # 1. 如果你想让节点从不选举为主节点,只用来存储数据,可作为负载器 
    # node.master: false 
    # node.data: true 
    # node.ingest: false
    
    # 2. 如果想让节点成为主节点,且不存储任何数据,并保有空闲资源,可作为协调器 
    # node.master: true 
    # node.data: false
    # node.ingest: false 
    
    # 3. 如果想让节点既不称为主节点,又不成为数据节点,那么可将他作为搜索器,从节点中获取数据,生成搜索结果等 
    # node.master: false 
    # node.data: false 
    # node.ingest: true (可不指定默认开启)
    
    # 4. 仅作为协调器 
    # node.master: false 
    # node.data: false
    # node.ingest: false
    
    # 监控集群状态有一下插件和API可以使用: 
    # Use the Cluster Health API [http://localhost:9200/_cluster/health], the 
    # Node Info API [http://localhost:9200/_nodes] or GUI tools # such as <http://www.elasticsearch.org/overview/marvel/>, 
    # <http://github.com/karmi/elasticsearch-paramedic>, 
    # <http://github.com/lukas-vlcek/bigdesk> and 
    # <http://mobz.github.com/elasticsearch-head> to inspect the cluster state. 
    
    # A node can have generic attributes associated with it, which can later be used 
    # for customized shard allocation filtering, or allocation awareness. An attribute 
    # is a simple key value pair, similar to node.key: value, here is an example: 
    # 每个节点都可以定义一些与之关联的通用属性,用于后期集群进行碎片分配时的过滤
    # node.rack: rack314 
    
    # 默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的es只启动一个节点,可以进行如下设置
    # node.max_local_storage_nodes: 1 
    
    #################################### Index #################################### 
    # 设置索引的分片数,默认为5 
    #index.number_of_shards: 5 
    
    # 设置索引的副本数,默认为1: 
    #index.number_of_replicas: 1 
    
    # 配置文件中提到的最佳实践是,如果服务器够多,可以将分片提高,尽量将数据平均分布到大集群中去
    # 同时,如果增加副本数量可以有效的提高搜索性能 
    # 需要注意的是,"number_of_shards" 是索引创建后一次生成的,后续不可更改设置 
    # "number_of_replicas" 是可以通过API去实时修改设置的 
    
    #################################### Paths #################################### 
    # 配置文件存储位置 
    # path.conf: /path/to/conf 
    
    # 数据存储位置(单个目录设置) 
    # path.data: /path/to/data 
    # 多个数据存储位置,有利于性能提升 
    # path.data: /path/to/data1,/path/to/data2 
    
    # 临时文件的路径 
    # path.work: /path/to/work 
    
    # 日志文件的路径 
    # path.logs: /path/to/logs 
    
    # 插件安装路径 
    # path.plugins: /path/to/plugins 
    
    #################################### Plugin ################################### 
    # 设置插件作为启动条件,如果一下插件没有安装,则该节点服务不会启动 
    # plugin.mandatory: mapper-attachments,lang-groovy 
    
    ################################### Memory #################################### 
    # 当JVM开始写入交换空间时(swapping)ElasticSearch性能会低下,你应该保证它不会写入交换空间 
    # 设置这个属性为true来锁定内存,同时也要允许elasticsearch的进程可以锁住内存,linux下可以通过 `ulimit -l unlimited` 命令 
    # bootstrap.mlockall: true 
    
    # 确保 ES_MIN_MEM 和 ES_MAX_MEM 环境变量设置为相同的值,以及机器有足够的内存分配给Elasticsearch 
    # 注意:内存也不是越大越好,一般64位机器,最大分配内存别才超过32G 
    
    ############################## Network And HTTP ############################### 
    # 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0 
    # network.bind_host: 192.168.0.1 
    
    # 设置其它节点和该节点交互的ip地址,如果不设置它会自动设置,值必须是个真实的ip地址 
    # network.publish_host: 192.168.0.1 
    
    # 同时设置bind_host和publish_host上面两个参数 
    # network.host: 192.168.0.1 
    
    # 设置节点间交互的tcp端口,默认是9300 
    # transport.tcp.port: 9300 
    
    # 设置是否压缩tcp传输时的数据,默认为false,不压缩
    # transport.tcp.compress: true 
    
    # 设置对外服务的http端口,默认为9200 
    # http.port: 9200 
    
    # 设置请求内容的最大容量,默认100mb 
    # http.max_content_length: 100mb 
    
    # 使用http协议对外提供服务,默认为true,开启 
    # http.enabled: false 
    
    ###################### 使用head等插件监控集群信息,需要打开以下配置项 ###########
    # http.cors.enabled: true
    # http.cors.allow-origin: "*"
    # http.cors.allow-credentials: true
    
    ################################### Gateway ################################### 
    # gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统 
    # gateway.type: local 
    
    # 下面的配置控制怎样以及何时启动一整个集群重启的初始化恢复过程 
    # (当使用shard gateway时,是为了尽可能的重用local data(本地数据)) 
    
    # 一个集群中的N个节点启动后,才允许进行恢复处理 
    # gateway.recover_after_nodes: 1 
    
    # 设置初始化恢复过程的超时时间,超时时间从上一个配置中配置的N个节点启动后算起 
    # gateway.recover_after_time: 5m 
    
    # 设置这个集群中期望有多少个节点.一旦这N个节点启动(并且recover_after_nodes也符合), 
    # 立即开始恢复过程(不等待recover_after_time超时) 
    # gateway.expected_nodes: 2
    
     ############################# Recovery Throttling ############################# 
    # 下面这些配置允许在初始化恢复,副本分配,再平衡,或者添加和删除节点时控制节点间的分片分配 
    # 设置一个节点的并行恢复数 
    # 1.初始化数据恢复时,并发恢复线程的个数,默认为4 
    # cluster.routing.allocation.node_initial_primaries_recoveries: 4 
    
    # 2.添加删除节点或负载均衡时并发恢复线程的个数,默认为2 
    # cluster.routing.allocation.node_concurrent_recoveries: 2 
    
    # 设置恢复时的吞吐量(例如:100mb,默认为0无限制.如果机器还有其他业务在跑的话还是限制一下的好) 
    # indices.recovery.max_bytes_per_sec: 20mb 
    
    # 设置来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5 
    # indices.recovery.concurrent_streams: 5 
    # 注意: 合理的设置以上参数能有效的提高集群节点的数据恢复以及初始化速度 
    
    ################################## Discovery ################################## 
    # 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点.默认为1,对于大的集群来说,可以设置大一点的值(2-4) 
    # discovery.zen.minimum_master_nodes: 1 
    # 探查的超时时间,默认3秒,提高一点以应对网络不好的时候,防止脑裂 
    # discovery.zen.ping.timeout: 3s 
    
    # For more information, see 
    # <http://elasticsearch.org/guide/en/elasticsearch/reference/current/modules-discovery-zen.html> 
    
    # 设置是否打开多播发现节点.默认是true. 
    # 当多播不可用或者集群跨网段的时候集群通信还是用单播吧 
    # discovery.zen.ping.multicast.enabled: false 
    
    # 这是一个集群中的主节点的初始列表,当节点(主节点或者数据节点)启动时使用这个列表进行探测 
    # discovery.zen.ping.unicast.hosts: ["host1", "host2:port"] 
    
    # Slow Log部分与GC log部分略,不过可以通过相关日志优化搜索查询速度 
    
    ################  X-Pack ###########################################
    # 官方插件 相关设置请查看此处
    # https://www.elastic.co/guide/en/x-pack/current/xpack-settings.html
    # 
    ############## Memory(重点需要调优的部分) ################ 
    # Cache部分: 
    # es有很多种方式来缓存其内部与索引有关的数据.其中包括filter cache 
    
    # filter cache部分: 
    # filter cache是用来缓存filters的结果的.默认的cache type是node type.node type的机制是所有的索引内部的分片共享filter cache.node type采用的方式是LRU方式.即:当缓存达到了某个临界值之后,es会将最近没有使用的数据清除出filter cache.使让新的数据进入es. 
    
    # 这个临界值的设置方法如下:indices.cache.filter.size 值类型:eg.:512mb 20%。默认的值是10%。 
    
    # out of memory错误避免过于频繁的查询时集群假死 
    # 1.设置es的缓存类型为Soft Reference,它的主要特点是据有较强的引用功能.只有当内存不够的时候,才进行回收这类内存,因此在内存足够的时候,它们通常不被回收.另外,这些引用对象还能保证在Java抛出OutOfMemory异常之前,被设置为null.它可以用于实现一些常用图片的缓存,实现Cache的功能,保证最大限度的使用内存而不引起OutOfMemory.在es的配置文件加上index.cache.field.type: soft即可. 
    
    # 2.设置es最大缓存数据条数和缓存失效时间,通过设置index.cache.field.max_size: 50000来把缓存field的最大值设置为50000,设置index.cache.field.expire: 10m把过期时间设置成10分钟. 
    # index.cache.field.max_size: 50000 
    # index.cache.field.expire: 10m 
    # index.cache.field.type: soft 
    
    # field data部分&&circuit breaker部分: 
    # 用于fielddata缓存的内存数量,主要用于当使用排序,faceting操作时,elasticsearch会将一些热点数据加载到内存中来提供给客户端访问,但是这种缓存是比较珍贵的,所以对它进行合理的设置. 
    
    # 可以使用值:eg:50mb 或者 30%(节点 node heap内存量),默认是:unbounded #indices.fielddata.cache.size: unbounded 
    # field的超时时间.默认是-1,可以设置的值类型: 5m #indices.fielddata.cache.expire: -1 
    
    # circuit breaker部分: 
    # 断路器是elasticsearch为了防止内存溢出的一种操作,每一种circuit breaker都可以指定一个内存界限触发此操作,这种circuit breaker的设定有一个最高级别的设定:indices.breaker.total.limit 默认值是JVM heap的70%.当内存达到这个数量的时候会触发内存回收
    
    # 另外还有两组子设置: 
    #indices.breaker.fielddata.limit:当系统发现fielddata的数量达到一定数量时会触发内存回收.默认值是JVM heap的70% 
    #indices.breaker.fielddata.overhead:在系统要加载fielddata时会进行预先估计,当系统发现要加载进内存的值超过limit * overhead时会进行进行内存回收.默认是1.03 
    #indices.breaker.request.limit:这种断路器是elasticsearch为了防止OOM(内存溢出),在每次请求数据时设定了一个固定的内存数量.默认值是40% 
    #indices.breaker.request.overhead:同上,也是elasticsearch在发送请求时设定的一个预估系数,用来防止内存溢出.默认值是1 
    
    # Translog部分: 
    # 每一个分片(shard)都有一个transaction log或者是与它有关的预写日志,(write log),在es进行索引(index)或者删除(delete)操作时会将没有提交的数据记录在translog之中,当进行flush 操作的时候会将tranlog中的数据发送给Lucene进行相关的操作.一次flush操作的发生基于如下的几个配置 
    #index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush.默认是 unlimited #index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作.默认是512mb 
    #index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作.默认是30m #index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作.es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s 
    #index.gateway.local.sync:多少时间进行一次的写磁盘操作,默认是5s 

    原文地址:https://my.oschina.net/Yumikio/blog/805877

    展开全文
  • Elasticsearch下载安装

    万次阅读 多人点赞 2019-07-31 19:26:09
    注:Elasticsearch 需要 Java 8 环境,在安装Elasticsearch之前先安装好JDK。 1、Windows版 1.1、下载 访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式的。 如果...

    注:Elasticsearch 需要 Java 8 环境,在安装Elasticsearch之前先安装好JDK。

    1、Windows版

    1.1、下载

    访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式的。

    如果不想下载最新版的,可以点击“past releases”选择过去的版本。我这里下载的是6.2.4版本的。

    1.2、解压

    解压下载的压缩包,比如我这里是解压到了D盘根目录,会出现D:\elasticsearch-6.2.4文件夹。

    1.3、启动

    进入elasticsearch的bin目录,双击elasticsearch.bat启动服务,默认端口是9200,如下图:

    启动完成之后,在浏览器中访问http://localhost:9200/,出现如下图所示内容表明Elasticsearch启动成功。

    2、linux版(centos7)

    2.1、下载

    可以按照windows版那样从官网下载TAR格式解压包,上传到linux服务器上。

    如果你的linux可以访问外网的话,推荐直接在linux中下载,执行如下命令:

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz

    2.2、解压

    执行解压命令:

    tar -zxvf elasticsearch-6.2.4.tar.gz

    解压完成后,会出现elasticsearch-6.2.4目录。

    2.3、启动

    执行启动命令:

    ./bin/elasticsearch

    如果你是root用户启动的话,会报"can not run elasticsearch as root"的错误。因为安全问题elasticsearch不让用root用户直接运行,所以要创建新用户,继续阅读2.4步骤。

    2.4、创建新用户

    第一步:liunx创建新用户:"adduser yjclsx",然后给创建的用户加密码:"passwd yjclsx",输入两次密码。

    第二步:切换刚才创建的用户:"su yjclsx",然后启动elasticsearch。如果显示Permission denied权限不足,则继续进行第三步。

    第三步:给新用户赋权限,因为这个用户本身就没有权限,肯定自己不能给自己付权限。所以要用root用户登录并赋予权限,chown -R yjclsx/你的elasticsearch安装目录。

    通过上面三步就可以启动elasticsearch了。

    2.5、验证启动是否成功

    如果一切正常,Elasticsearch就会在默认的9200端口运行。这时,打开另一个命令行窗口,请求该端口:

    curl localhost:9200

    如果得到如下的返回,就说明启动成功了:

    2.6、远程访问elasticsearch服务

    默认情况下,Elasticsearch 只允许本机访问,如果需要远程访问,可以修改 Elasticsearch 安装目录中的config/elasticsearch.yml文件,去掉network.host的注释,将它的值改成0.0.0.0,让任何人都可以访问,然后重新启动 Elasticsearch 。

    network.host: 0.0.0.0

    上面代码中,"network.host:"和"0.0.0.0"中间有个空格,不能忽略,不然启动会报错。线上服务不要这样设置,要设成具体的 IP。

    2.7、常见错误及其解决方式

    错误一:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

    解决:执行下面的命令:

    sudo sysctl -w vm.max_map_count=262144

    错误二:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

    解决:执行下面的命令:

    sudo vim /etc/security/limits.conf

    在limits.conf最下方加入下面两行(这里的yjclsx是之前2.4步骤中新建的用户名):

    yjclsx hard nofile 65536
    yjclsx soft nofile 65536

     

    展开全文
  • springboot集成elasticsearch注意事项

    万次阅读 多人点赞 2019-07-31 19:27:29
    一、elasticsearch基础  这里假设各位已经简单了解过elasticsearch,并不对es进入更多的,更深层次的解释,如有必要,会在写文章专门进行es讲解。  Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。...

    一、elasticsearch基础

       这里假设各位已经简单了解过elasticsearch,并不对es进入更多的,更深层次的解释,如有必要,会在写文章专门进行es讲解。

      Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

      但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

      Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

       index ==》索引 ==》Mysql中的一个库,库里面可以建立很多表,存储不同类型的数据,而表在ES中就是type。

       type ==》类型 ==》相当于Mysql中的一张表,存储json类型的数据

       document  ==》文档 ==》一个文档相当于Mysql一行的数据

       field ==》列 ==》相当于mysql中的列,也就是一个属性

     这里多说下:

    在Elasticsearch6.0.0或者或者更新版本中创建的索引只会包含一个映射类型(mappingtype)。在5.x中创建的具有多个映射类型的索引在Elasticsearch6.x中依然会正常工作。在Elasticsearch7.0.0中,映射类型type将会被完全移除。

    原文链接

      开始的时候,我们说“索引(index)”类似于SQL数据库中的“数据库”,将“类型(type)”等同于“表”。

      这是一个糟糕的类比,并且导致了一些错误的假设。在SQL数据库中,表之间是相互独立的。一个表中的各列并不会影响到其它表中的同名的列。而在映射类型(mappingtype)中却不是这样的。

       在同一个Elasticsearch索引中,其中不同映射类型中的同名字段在内部是由同一个Lucene字段来支持的。换句话说,使用上面的例子,user类型中的user_name字段与tweet类型中的user_name字段是完全一样的,并且两个user_name字段在两个类型中必须具有相同的映射(定义)。

       这会在某些情况下导致一些混乱,比如,在同一个索引中,当你想在其中的一个类型中将deleted字段作为date类型,而在另一个类型中将其作为boolean字段。

       在此之上需要考虑一点,如果同一个索引中存储的各个实体如果只有很少或者根本没有同样的字段,这种情况会导致稀疏数据,并且会影响到Lucene的高效压缩数据的能力。

       基于这些原因,将映射类型的概念从Elasticsearch中移除。

    二、springboot 对应的Es版本关系

    springboot  elasticsearch
    2.0.0.RELEASE 2.2.0
    1.4.0.M1 1.7.3
    1.3.0.RELEASE 1.5.2
    1.2.0.RELEASE 1.4.4
    1.1.0.RELEASE 1.3.2
    1.0.0.RELEASE 1.1.1

      1、None of the configured nodes are available 或者org.elasticsearch.transport.RemoteTransportException: Failed to deserialize exception response from stream

      原因:spring data elasticSearch 的版本与Spring boot、Elasticsearch版本不匹配。

    这是版本之间的对应关系。Spring boot 1.3.5默认的elasticsearch版本是1.5.2,此时启动1.7.2版本以下的Elasticsearch客户端连接正常。

      注:注意java的es默认连接端口是9300,9200是http端口,这两个在使用中应注意区分。

      2、Caused by: java.lang.IllegalArgumentException: @ConditionalOnMissingBean annotations must specify at least one bean (type, name or annotation)

      原因:spring boot是1.3.x版本,而es采用了2.x版本。在es的2.x版本去除了一些类,而这些类在spring boot的1.3.x版本中仍然被使用,导致此错误

        以上解决参考下面的对应关系

    Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)
    x <= 1.3.5 y <= 1.3.4 z <= 1.7.2*
    x >= 1.4.x 2.0.0 <=y < 5.0.0** 2.0.0 <= z < 5.0.0**

       请一定注意版本兼容问题。这关系到很多maven依赖。Spring Data Elasticsearch Spring Boot version matrix

    ik 分词对应的版本关系:

      elasticsearch-analysis-ik

    Analyzer:

       ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word

    Versions

    IK version ES version
    master 6.x -> master
    6.2.2 6.2.2
    6.1.3 6.1.3
    5.6.8 5.6.8
    5.5.3 5.5.3
    5.4.3 5.4.3
    5.3.3 5.3.3
    5.2.2 5.2.2
    5.1.2 5.1.2
    1.10.6 2.4.6
    1.9.5 2.3.5
    1.8.1 2.2.1
    1.7.0 2.1.1
    1.5.0 2.0.0
    1.2.6 1.0.0
    1.2.5 0.90.x
    1.1.3 0.20.x
    1.0.0 0.16.2 -> 0.19.0

    三、环境构建

    maven依赖:前提是依赖

    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>1.5.9.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    配置文件:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    # ES

    #开启 Elasticsearch 仓库(默认值:true)

    spring.data.elasticsearch.repositories.enabled=true

    #默认 9300 是 Java 客户端的端口。9200 是支持 Restful HTTP 的接口

    spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

    #spring.data.elasticsearch.cluster-name Elasticsearch 集群名(默认值: elasticsearch)

    #spring.data.elasticsearch.cluster-nodes 集群节点地址列表,用逗号分隔。如果没有指定,就启动一个客户端节点

    #spring.data.elasticsearch.propertie 用来配置客户端的额外属性

    #存储索引的位置

    spring.data.elasticsearch.properties.path.home=/data/project/target/elastic

    #连接超时的时间

    spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s

     四、es索引实体类

    Spring-data-elasticsearch为我们提供了@Document@Field等注解,如果某个实体需要建立索引,只需要加上这些注解即可

    1.类上注解:@Document (相当于Hibernate实体的@Entity/@Table)(必写),加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。

    类型 属性名 默认值 说明
    String indexName 索引库的名称,建议以项目的名称命名
    String type “” 类型,建议以实体的名称命名
    short shards 5 默认分区数
    short replica 1 每个分区默认的备份数
    String refreshInterval “1s” 刷新间隔
    String indexStoreType “fs” 索引文件存储类型

    2.主键注解:@Id (相当于Hibernate实体的主键@Id注解)(必写)

    只是一个标识,并没有属性。

    3.属性注解 @Field (相当于Hibernate实体的@Column注解)

    @Field默认是可以不加的,默认所有属性都会添加到ES中。加上@Field之后,@document默认把所有字段加上索引失效,只有家@Field 才会被索引(同时也看设置索引的属性是否为no)

     

    类型 属性名 默认值 说明
    FieldType type FieldType.Auto 自动检测属性的类型
    FieldIndex index FieldIndex.analyzed 默认情况下分词
    boolean store false 默认情况下不存储原文
    String searchAnalyzer “” 指定字段搜索时使用的分词器
    String indexAnalyzer “” 指定字段建立索引时指定的分词器
    String[] ignoreFields {} 如果某个字段需要被忽略
     

    五、相关查询方法

     官网参考

      实现方式比较多,已经存在的接口,使用根据需要继承即可:

      1、CrudRepository接口 

    public interface CrudRepository<T, ID extends Serializable>
      extends Repository<T, ID> {
    
      <S extends T> S save(S entity);      
    
      Optional<T> findById(ID primaryKey); 
    
      Iterable<T> findAll();               
    
      long count();                        
    
      void delete(T entity);               
    
      boolean existsById(ID primaryKey);   
    
      // … more functionality omitted.
    }

      2、PagingAndSortingRepository接口

    public interface PagingAndSortingRepository<T, ID extends Serializable>
      extends CrudRepository<T, ID> {
    
      Iterable<T> findAll(Sort sort);
    
      Page<T> findAll(Pageable pageable);
    }

     例子:

    分页:

    PagingAndSortingRepository<User, Long> repository = // … get access to a bean
    Page<User> users = repository.findAll(new PageRequest(1, 20));
    

    计数:

    interface UserRepository extends CrudRepository<User, Long> {
    
      long countByLastname(String lastname);
    }  

      3、其他,参考官网

    自定义查询实现

    那么我们如何自定义方法呢?我们只要使用特定的单词对方法名进行定义,那么Spring就会对我们写的方法名进行解析, 

    该机制条前缀find…Byread…Byquery…Bycount…By,和get…By从所述方法和开始分析它的其余部分。引入子句可以包含进一步的表达式,如Distinct在要创建的查询上设置不同的标志。然而,第一个By作为分隔符来指示实际标准的开始。在非常基础的层次上,您可以定义实体属性的条件并将它们与And和连接起来Or

    interface PersonRepository extends Repository<User, Long> {
    
      List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
    
      // Enables the distinct flag for the query
      List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
      List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);
    
      // Enabling ignoring case for an individual property
      List<Person> findByLastnameIgnoreCase(String lastname);
      // Enabling ignoring case for all suitable properties
      List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);
    
      // Enabling static ORDER BY for a query
      List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
      List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
    }

      构建查询属性算法原理

    如上例所示。在查询创建时,确保解析的属性是托管类的属性。但是,你也可以通过遍历嵌套属性来定义约束。假设Person x有一个Address和 ZipCode。在这种情况下,方法名称为

    List<Person> findByAddressZipCode(ZipCode zipCode);
    

    创建属性遍历x.address.zipCode。解析算法首先将整个part(AddressZipCode)作为属性进行解释,然后检查具有该名称属性的类。如果皮匹配成功,则使用该属性。如果不是属性,则算法拆分从右侧的驼峰部分头部和尾部,并试图找出相应的属性,在我们的例子,AddressZipCode。如果算法找到具有该头部的属性,它将采用尾部并继续从那里构建树,然后按照刚刚描述的方式分割尾部。如果第一个分割不匹配,则算法将分割点移动到左侧(AddressZipCode)并继续。

    虽然这应该适用于大多数情况,但算法仍可能会选择错误的属性。假设这个Person类也有一个addressZip属性。该算法将在第一轮拆分中匹配,并且基本上选择错误的属性并最终失败(因为addressZip可能没有code属性的类型)。

    为了解决这个歧义,你可以\_在你的方法名称中使用手动定义遍历点。所以我们的方法名称会像这样结束:

    List<Person> findByAddress_ZipCode(ZipCode zipCode);
    由于我们将下划线视为保留字符,因此我们强烈建议遵循标准的Java命名约定(即,不要在属性名称中使用下划线,而应使用驼峰大小写)
    
    其他分页查询
    
    Page<User> findByLastname(String lastname, Pageable pageable);
    
    Slice<User> findByLastname(String lastname, Pageable pageable);
    
    List<User> findByLastname(String lastname, Sort sort);
    

    也可以用Java8 Stream查询和sql语句查询

    1

    2

    3

    4

    5

    6

    7

    @Query("select u from User u")

    Stream<User> findAllByCustomQueryAndStream();

     

    Stream<User> readAllByFirstnameNotNull();

     

    @Query("select u from User u")

    Stream<User> streamAllPaged(Pageable pageable);

    有些在复杂的可以使用es查询语句

    我们可以使用@Query注解进行查询,这样要求我们需要自己写ES的查询语句

    public interface BookRepository extends ElasticsearchRepository<Book, String> {
        @Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")
        Page<Book> findByName(String name,Pageable pageable);
    }
    

    方法和es查询转换:

    Keyword Sample Elasticsearch Query String

    And

    findByNameAndPrice

    {"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}

    Or

    findByNameOrPrice

    {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}}

    Is

    findByName

    {"bool" : {"must" : {"field" : {"name" : "?"}}}}

    Not

    findByNameNot

    {"bool" : {"must_not" : {"field" : {"name" : "?"}}}}

    Between

    findByPriceBetween

    {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

    LessThanEqual

    findByPriceLessThan

    {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

    GreaterThanEqual

    findByPriceGreaterThan

    {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}

    Before

    findByPriceBefore

    {"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}}

    After

    findByPriceAfter

    {"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}}

    Like

    findByNameLike

    {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}

    StartingWith

    findByNameStartingWith

    {"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}}

    EndingWith

    findByNameEndingWith

    {"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}}

    Contains/Containing

    findByNameContaining

    {"bool" : {"must" : {"field" : {"name" : {"query" : "?","analyze_wildcard" : true}}}}}

    In

    findByNameIn(Collection<String>names)

    {"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}}

    NotIn

    findByNameNotIn(Collection<String>names)

    {"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}}

    Near

    findByStoreNear

    Not Supported Yet !

    True

    findByAvailableTrue

    {"bool" : {"must" : {"field" : {"available" : true}}}}

    False

    findByAvailableFalse

    {"bool" : {"must" : {"field" : {"available" : false}}}}

    OrderBy

    findByAvailableTrueOrderByNameDesc

    {"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}}

    六、between使用注意

      在使用的时候没有找到直接的例子,由于between是转换成range,所以需要范围参数from和to,

     举例如下:

    Page<Recruit> findByRecruitWorkAndRecruitCitysAndWorkTypeAndXjTimeBetween(String recruitWork, String recruitCitys, Integer workType, Date fromXjTime, Date toXjTime,Pageable pageable);

    注意:这里必须要注意的是:只要使用了between参数,****XjTimeBetween(......,from,to) ,使用该方法的时候,必须要传递范围参数from,to,不能同时为空。

    否则异常

    <strong>org.springframework.dao.InvalidDataAccessApiUsageException: Range [* TO *] is not allowed</strong>
    
        at org.springframework.data.elasticsearch.core.query.Criteria.between(Criteria.java:304)
    
        at org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator.from(ElasticsearchQueryCreator.java:127)
    
        at org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator.and(ElasticsearchQueryCreator.java:76)
    
        at org.springframework.data.elasticsearch.repository.query.parser.ElasticsearchQueryCreator.and(ElasticsearchQueryCreator.java:46)
    
        at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:109)
    
        at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:88)
    
        at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:73)
    
        at org.springframework.data.elasticsearch.repository.query.ElasticsearchPartQuery.createQuery(ElasticsearchPartQuery.java:102)
    
        at org.springframework.data.elasticsearch.repository.query.ElasticsearchPartQuery.execute(ElasticsearchPartQuery.java:51)
    
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:499)
    
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:477)
    
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
    
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    
        at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
    
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    
        at com.sun.proxy.$Proxy86.findByRecruitWorkAndRecruitCitysAndWorkTypeAndXjTimeBetween(Unknown Source)
    
        at com.zhimingdeng.service.impl.EsIndexServiceImpl.findByRecruitWorkAndRecruitCitysAndWorkTypeAndXjTimeBetween(EsIndexServiceImpl.java:155)

    因为底层要求参数不能同时为空

    七、es时间类型注意

       对于Elasticsearch原生支持date类型,json格式通过字符来表示date类型。所以在用json提交日期至elasticsearch的时候,es会隐式转换,把es认为是date类型的字符串直接转为date类型,间字段内容实际上就是转换成long类型作为内部存储的(所以完全可以接受其他时间格式作为时间字段的内容)。至于什么样的字符串es会认为可以转换成date类型,参考elasticsearch官网介绍

      date类型是包含时区信息的,如果我们没有在json代表日期的字符串中显式指定时区,对es来说没什么问题,但是对于我们来说可能会发现一些时间差8个小时的问题。

      Elastic本身有一种特殊的时间格式,其形式如"2016-01-25T00:00:00",此格式为ISO8601标准。具体时间日期格式要求可以参见es官方文档

      然而我们在计算日期间隔,甚至按日分类的时候,往往需要把这个String时间转化为Unix时间戳(Unix Timestamp(时间戳))的形式,再进行计算。而通常,这个时间戳会以毫秒的形式(Java)保存在一个long类型里面,这就涉及到了String与long类型的相互转化。

      此外在使用Java Client聚合查询日期的时候,需要注意时区问题,因为默认的es是按照UTC标准时区算的,所以不设置的聚合统计结果是不正确的。默认不设置时区参数,es是安装UTC的时间进行查询的,所以分组的结果可能与预期不一样。  

      JSON 没有日期类型,因此在 Elasticsearch 中可以表达成:

    1. 日期格式化的字符串,比如: "2018-01-01" 或者 "2018/01/01 01:01:30";
    2. 毫秒级别的 long 类型或秒级别的 integer 类型,比如: 1515150699465, 1515150699;

      实际上不管日期以何种格式写入,在 ES 内部都会先穿换成 UTC 时间并存储为 long 类型。日期格式可以自定义,如果没有指定的话会使用以下的默认格式:

      "strict_date_optional_time||epoch_millis"

      因此总结来说,不管哪种可以表示时间的格式写入,都可以用来表示时间

      所以这里引出多种解决方案:

       1、es 默认的是 utc 时间,而国内服务器是 cst 时间,首先有时间上的差距需要转换。但是如果底层以及上层都统一用时间戳,完美解决时区问题。但是时间戳对我们来说不直观 

      2、我们在往es提交日期数据的时候,直接提交带有时区信息的日期字符串,如:“2016-07-15T12:58:17.136+0800”

      3、还有另外的一种:   

     直接设置format为你想要的格式,比如 "yyyy-MM-dd HH:mm:ss" 然后存储的时候,指定格式,并且Mapping  也是指定相同的format 。

      第一次使用方式:

    1

    2

    3

    4

     @Field( type = FieldType.Date,

                format = DateFormat.custom,pattern = date_optional_time"

        )

    private Date gmtCreate;

    我这里是数据是从数据库直接读取,使用的datetime类型,原来直接使用的时候,抛异常:

      MapperParsingException[failed to parse [***]]; nested: IllegalArgumentException[Invalid format: "格式"];

      原因是: jackson库在转换为json的时候,将Date类型转为为了long型的字符串表示,而我们定义的是date_optional_time格式的字符串,所以解析错误,

      具体的解决办法:去掉注解中的format=DateFormat.date_optional_time,让其使用默认的格式,也就是 'strict_date_optional_time||epoch_millis' , 既能接受        date_optional_time格式的,也能接受epoch_millis格式,由于为了查看更直观感受改为如下:

      @Field( type = FieldType.Date,
                format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
        )
    private Date gmtCreate;

     改成这样后,底层多种格式都可以存储,如果没有根据时间进行范围查找,这里基本上已经就告一段落了。

    时间范围查找需求:存储Date,和取出来也是Dete

    存储的时候利用各种JSON对象,如 Jackson 等。存储的时候就可以用JSON Format一下再存储,然后取出来后

      @Field( type = FieldType.Date,
                format = DateFormat.custom,pattern = "yyyy-MM-dd HH:mm:ss"
        )
        @JsonFormat (shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
        private Date xjTime;

     有了这个注解后,

        timezone="GMT+8" 主要是因为底层存放的数据日期时区是UTC,这里转换成GMT
    

     真实存储格式如下(高能瞎眼):

    时间范围查找需求注意:

    根据条件查询的时候,时间范围需要传入range,这里涉及到了两种选择,底层查询方法实现的时候range的参数为

     1.date:

     传入的是date参数,然后就行查询的时候,会报异常,因为我把日期转成了yyyy-MM-dd HH:mm:ss,但是底层数据是2018-03-27T16:00:00.000Z这种格式,导致错误,详细异常如下

    org.elasticsearch.action.search.SearchPhaseExecutionException: all shards failed
    
        at org.elasticsearch.action.search.AbstractSearchAsyncAction.onFirstPhaseResult(AbstractSearchAsyncAction.java:206)
    
        at org.elasticsearch.action.search.AbstractSearchAsyncAction$1.onFailure(AbstractSearchAsyncAction.java:152)
    
        at org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:46)
    
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.processException(TransportService.java:855)
    
        at org.elasticsearch.transport.TransportService$DirectResponseChannel.sendResponse(TransportService.java:833)
    
        at org.elasticsearch.transport.TransportService$4.onFailure(TransportService.java:387)
    
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:39)
    
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    
        at java.lang.Thread.run(Thread.java:745)
    
    <strong>Caused by: org.elasticsearch.ElasticsearchParseException: failed to parse date field [2018-03-27T16:00:00.000Z] with format [yyyy-MM-dd HH:mm:ss]</strong>
    
        at org.elasticsearch.common.joda.DateMathParser.parseDateTime(DateMathParser.java:203)
    
        at org.elasticsearch.common.joda.DateMathParser.parse(DateMathParser.java:67)
    
        at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType.parseToMilliseconds(DateFieldMapper.java:451)
    
        at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType.innerRangeQuery(DateFieldMapper.java:435)
    
        at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType.access$000(DateFieldMapper.java:199)
    
        at org.elasticsearch.index.mapper.core.DateFieldMapper$DateFieldType$LateParsingQuery.rewrite(DateFieldMapper.java:224)
    
        at org.apache.lucene.search.BooleanQuery.rewrite(BooleanQuery.java:278)
    
        at org.apache.lucene.search.IndexSearcher.rewrite(IndexSearcher.java:837)
    
        at org.elasticsearch.search.internal.ContextIndexSearcher.rewrite(ContextIndexSearcher.java:81)
    
        at org.elasticsearch.search.internal.DefaultSearchContext.preProcess(DefaultSearchContext.java:231)
    
        at org.elasticsearch.search.query.QueryPhase.preProcess(QueryPhase.java:103)
    
        at org.elasticsearch.search.SearchService.createContext(SearchService.java:676)
    
        at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:620)
    
        at org.elasticsearch.search.SearchService.executeDfsPhase(SearchService.java:264)
    
        at org.elasticsearch.search.action.SearchServiceTransportAction$SearchDfsTransportHandler.messageReceived(SearchServiceTransportAction.java:360)
    
        at org.elasticsearch.search.action.SearchServiceTransportAction$SearchDfsTransportHandler.messageReceived(SearchServiceTransportAction.java:357)
    
        at org.elasticsearch.transport.TransportRequestHandler.messageReceived(TransportRequestHandler.java:33)
    
        at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:75)
    
        at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:376)
    
        at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    
        ... 3 common frames omitted
    
    <strong>Caused by: java.lang.IllegalArgumentException: Invalid format: "2018-03-27T16:00:00.000Z" is malformed at "T16:00:00.000Z"</strong>
    
        at org.joda.time.format.DateTimeParserBucket.doParseMillis(DateTimeParserBucket.java:187)
    
        at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:826)
    
        at org.elasticsearch.common.joda.DateMathParser.parseDateTime(DateMathParser.java:200)
    
        ... 22 common frames omitted

    实现参考:解决:传入的date参数格式化成底层的类型  

    Page<Recruit> findByRecruitWorkAndRecruitCitysAndWorkTypeAndXjTimeBetween(String recruitWork, String recruitCitys, Integer workType, Date fromXjTime, Date toXjTime,Pageable pageable);
    

      2.String:

     参数直接使用string,避免上层转换成不合适的时间格式,使用框架底层自己转换,避免错误。

    实现参考:
    Page<Recruit> findByRecruitWorkAndRecruitCitysAndWorkTypeAndXjTimeBetween(String recruitWork, String recruitCitys, Integer workType, String fromXjTime, String toXjTime,Pageable pageable);
    

    es时间自定义类型

    https://stackoverflow.com/questions/29122071/elasticsearch-failed-to-parse-date

    https://stackoverflow.com/questions/29496081/spring-data-elasticsearchs-field-annotation-not-working

    https://stackoverflow.com/questions/32042430/elasticsearch-spring-data-date-format-always-is-long

    八、使用注意

      个人认为springboot 这种集成es的方法,最大的优点是开发速度快,不要求对es一些api要求熟悉,能快速上手,即使之前对es不胜了解,也能通过方法名或者sql快速写出自己需要的逻辑,而具体转换成api层的操作,则有框架底层帮你实现。

      缺点也显而易见首先,使用的springboot的版本对es的版本也有了要求,不能超过es的某些版本号,部署时需要注意。第二,速度提升的同时,也失去了一些实用api的灵活性。一些比较灵活的条件封装不能很容易的实现。各有利弊,各位权衡。

    原文地址:http://www.cnblogs.com/guozp/p/8686904.html

    展开全文
  • ElasticSearch原理

    万次阅读 2020-03-25 22:08:21
    ElasticSearch是一个分布式系统, 隐藏了复杂的处理机制 分片机制:我们不用关心数据是按照什么机制分片的、最后放入到哪个分片中 分片的副本: 集群发现机制(cluster discovery):比如当前我们启动了一-个es进程,当...


    3.1解析es的分布式架构
    3.1.1分布式架构的透明隐藏特性
    ElasticSearch是一个分布式系统, 隐藏了复杂的处理机制
    分片机制:我们不用关心数据是按照什么机制分片的、最后放入到哪个分片中
    分片的副本:
    集群发现机制(cluster discovery):比如当前我们启动了一-个es进程,当启动了第二个es进程时,这个进程作为-个node自动就发现了集群,并且加入了进去
    shard负载均衡:比如现在有10shard,集群中有3个节点,es会进行均衡的进行分配,以保持每个节点均衡的负载请求
    请求路由
    3.1.2扩容机制
    垂直扩容:购置新的机器,昔换已有的机器
    水平扩容:直接增加机器
    3.1.3 rebalance
    增加或减少节点时会自动均衡

    展开全文
  • docker安装ElasticSearch:7.8.0集群

    万次阅读 2020-07-05 01:20:51
    ElasticSearch集群支持动态请求的方式搭建集群和静态配置文件搭建集群 关于集群的动态连接方式官方的文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-update-settings.html 前置...
  • ElasticSearch

    万次阅读 2012-09-07 19:31:45
    Elastic Search 是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,...curl http://cloud.github.com/downloads/elasticsearch/elasticsearch/elasticse
  • ElasticSearch简介

    万次阅读 多人点赞 2019-05-18 08:51:31
    摘自Elasticsearch-基础介绍及索引原理分析 Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单...
  • 最近在看ES一些深入的功能,就很好奇分片与副本的数据一致性是怎么处理的(类似于数据库分布式事务问题),果然在...官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/docs-index_.html#inde...
  • 链接: https://pan.baidu.com/s/1oxHSv33e0VpOQSlDZIVGzQ 提取码: a9th
  • Elasticsearch学习,请先看这一篇!

    万次阅读 多人点赞 2016-08-18 21:08:36
    题记:Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识、原理从初学者认知、学习的角度,从以下9个方面进行详细梳理。欢迎讨论……0. 带着问题上路——ES是如何产生的?(1)思考:大规模数据如何...
  • 1. 修改pom文件配置 ...elasticsearch.version>1.7.1</elasticsearch.version> <dependency> <groupId>org.ansj</groupId> <artifactId>ansj_seg</artifactId> <c...
  • Elasticsearch从入门到实战

    千人学习 2019-09-29 12:07:42
    Elasticsearch是业界领先的海量搜索引擎,开箱即用的特性让其拥有最多的装机量。当前采用和使用Elasticsearch的企业越来越多。 本课程不仅会涉及Elasticsearch的基本安装和配置,更会对其基本操作进行详细的...
  • <artifactId>spring-boot-starter-data-elasticsearch <version>2.1.4.RELEASE <groupId>org.springframework.data <artifactId>spring-data-elasticsearch <version>2.1.4.RELEASE ...
  • 详述 Elasticsearch 通过范围条件查询索引数据的方法

    万次阅读 多人点赞 2019-04-05 11:15:59
    在使用 Elasticsearch 的时候,我们可能会遇到需要**以范围为条件查询索引数据**的需求。有两种方法可以实现我们的需求: - 第一种:在服务器或者终端,使用命令来查询索引数据; - 第二种:编写程序,通过 Elastic...
  • Elasticsearch 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布...
  • 有一种情况,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step1 查找ES进程号 ps -ef | ...
  • 最近公司项目用到Elasticsearch,自己摸索了好几天才把这个弄明白,和大家分享一下: 一、建立Elasticsearch连接 package com.wlsj.yshj.config; import org.apache.http.HttpHost; import org.apache....
  • Linux安装elasticsearch7.2和kibana7.2最新教程

    万次阅读 热门讨论 2019-07-17 00:53:45
    2019年最新版centos7.6 elasticsearch安装坑爹教程终于在这个重庆凉爽的夏季来到,那么老夫就直奔主题了,首先需要说明的是,Linux安装JDK8(或者更高版本的)后配好环境变量,然后再安装elasticsearch搜索引擎(或者叫他...
  • ElasticSearch手动创建mapping

    万次阅读 2020-03-14 18:39:35
    前面也提到过关于手动创建mapping,接着上一篇关于object类型存储以及mapping的介绍,我们接下来就介绍下如何手动创建mapping #手动创建mapping PUT /lib6 { "settings":{ "number_of_shards" : 3, ...
  • 使用postman操作ElasticSearch

    万次阅读 2020-03-04 22:09:19
    下载安装好postman之后 添加索引blog1(因为ElasticSearch是restful请求所以我们用postman发送http请求给ElasticSearch) { "mappings":{ "article":{ "properties":{ "id":{ ...
  • 什么是 Elasticsearch 想查数据就免不了搜索,搜索就离不开搜索引擎,百度、谷歌都是一个非常庞大复杂的搜索引擎,他们几乎索引了互联网上开放的所有网页和数据。然而对于我们自己的业务数据来说,肯定就没必要用...
  • Elasticsearch查询性能优化

    万次阅读 2020-03-25 22:04:46
    constant_score的用处 当我们不关心检索词频率TF(Term Frequency)对搜索结果排序的影响时,可以使用constant_score将查询语句query或者过滤语句filter包装起来。...ElasticSearch支持多种不同...
  • 之前用的elasticsearch是1.3.2版本的,装了ik插件,用起来很正常,后面elasticsearch换成2.0.0的了,还装了logstash2.0.0,kibana4.2.0, ik分词器是1.5.0的,用Java代码批量插入的时候就报错了,在elasticsearch的...
  • elasticsearch-jdbc实现MySQL同步到ElasticSearch深入详解

    万次阅读 多人点赞 2016-06-16 20:43:07
    1.如何实现mysql与elasticsearch的数据同步?逐条转换为json显然不合适,需要借助第三方工具或者自己实现。核心功能点:同步增、删、改、查同步。2、mysql与elasticsearch同步的方法有哪些?优缺点对比?目前该领域...
  • ElasticSearch外部版本控制

    万次阅读 2020-03-09 21:41:50
    #外部版本控制机制| PUT /library/books/1?version=5&version_type=external { "title": "Elosticsearch: The Definitive Guide" , "name":{ "first" : "Zachary", "last" : "Tong" }, ...
  • ElasticSearch7.0.0安装sql

    万次阅读 2020-04-08 11:23:58
    切换到elasticsearch的home目录执行: bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.0.0.0/elasticsearch-sql-7.0.0.0.zip 修改config/elasticsearch....
  • 在 spring boot 项目中即成集成 elasticsearch(dao层数据与es交互使用的的是 spring-data-elasticsearch)首先安装了服务器端的 es 服务,和 head 插件,es 服务启动正常,node-1 为默认主节点,my-cluster 为集群...
  • elasticsearch内部版本控制

    万次阅读 2020-03-09 20:52:22
    现在我将这个price价格改为10,看下版本有什么变化? 获取一下 返回结果我们知道价格price已经修改为10,_version已经变成2 我们把参数version改成2试试 我们从执行结果可知,我们已经修改成功......
  • ElasticSearch javaAPI demo示例

    万次阅读 2017-09-28 08:57:05
    一.数据实体: ID:自增主键 ID:ID值 VALUE_DAY:该机器当天的值 GROUPNAME:组名 TYPE_MACHINE:机器类型 ...package elasticsearch.util; import java.net.InetAddress; import org.elastic

空空如也

1 2 3 4 5 ... 20
收藏数 137,421
精华内容 54,968
关键字:

elasticsearch