查询和过滤
elasticsearch中有查询和过滤两种功能,过滤只是用特定条件来筛选结果的,而查询不仅筛选结果还会影响文档的得分,计算得分会消耗额外的CPU
接口幂等是指多次发送同一个请求,保证操作执行一次
通过概念得知需要多次发送同一个请求,那么多次请求的原因有哪些
针对上述情况如何解决呢?
elasticsearch有很多Java Api提供使用
使用最原始的TransportClient来进行操作
1 | <dependency> |
创建TransportClient,后续操作都需要用到该对象
1 | TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) |
什么是脑裂?就是同一集群中的不同节点对于集群状态有了不一样的理解,比如elasticsearch集群中有节点A(主节点),节点B(从节点),若由于网络问题两个节点之间的通信中断了,此时两个节点都认为对方已经挂了,节点A不进行任何操作,因为节点A本身就是主节点;但是节点B会将本身提升为主节点,此时就会导致elasticsearch有了两个主节点,发送到节点A上的索引请求不会将数据分配到节点B,同时发送到节点B的请求也不会将数据分配到节点A。这种情况下导致搜索请求命中哪个节点结果都不会相同
造成脑裂的原因
为了避免脑裂的发生,elasticsearch提供了一些配置
discovery.zen.minimum_master_nodes
表示决定主节点选择过程中最少需要有多少个master节点参与选举,默认是1,最好配置为N/2+1(N为候选master节点数)discovery.zen.ping.timeout
节点间网络通信的等待时间,默认3s,可以调大超时时间,减少误判这就需要了解浏览器的同源策略,所谓同源是指 ‘协议+域名+端口’三者相同,而跨域就是非同源的请求
通过代理来避免,如使用nginx在后端转发请求,来避免前端出现跨域
在server块中增加
1 | # 允许跨域请求的域,*代表所有 |
使用jsonp
浏览器的同源策略不包含<script>
、<img>
、<iframe>
这几个标签,而jsonp就是利用<script>
标签跨域特性来进行的跨域数据访问,其原理是与服务器端约定好一个函数名,服务端接收到请求后,将返回一段JavaScript,在这段JavaScript代码中调用约定好的回调函数,并且将数据作为参数进行传递,当网页接收到这段JavaScript后,就会执行回调函数,数据就成功传输到客户端了
其缺点是只支持GET请求
在web项目中配置过滤器或拦截器来解决跨域
1 | httpServletResponse.setHeader("Access-Control-Allow-Origin", origin); |