2、Elastic更新文档几个小记录

1、max_result_window

默认Elastic 最大返回结果大小10000,当查询的结果大于10000时,返回的也是10000.
from+size<=10000

1.1、分页时,有时报异常illegal_argument_exception

Result window is too large, from + size must be less than or equal to: [10000] but was [10001]
这是from+size大于指定的max_result_window了

GET /zx-broker/_search
{
  "query": {
    "match_all": {}
  },
  "size": 9901,
  "from": 100
}

1.2、动态更新索引 max_result_window

PUT /zx-broker/_settings
{
  "max_result_window":10005
}

1.3、创建索引时指定 max_result_window

PUT /zx-broker-20201231-1
{
  "aliases": {
    "zx-broker": {
    }
  }, 
  "settings": {
    "number_of_shards": 3, 
    "number_of_replicas": 1, 
    "index.analysis.analyzer.default.type": "ik_max_word",
	"index.max_result_window":10005
  },
  "mappings": {
  }
}

2、track_total_hits 追踪所有

Elastic 默认查找时,如果查询结果大于10000时,只返回10000总数,实际查询具体结果是多少不知道。

GET /zx-housecomment/_search
{
  "query": {
    "match_all": {}
  }
}

#返回结果如下,不知道具体多少个匹配
"hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    }

track_total_hits 返回具体查询数量

GET /zx-housecomment/_search
{
  "query": {
    "match_all": {}
  },
  "track_total_hits": true
}

3、track_scores 强制score打分

有时查询时没有match、只有range、term等查询条件,或有排序时,Elastic默认是不会score打分的,但是有时我们也必须要获取这个score分数,可以添加track_scores强制打分

GET /zx-broker/_search
{
  "track_scores":true,
  "query": {
    "term": {
      "brokerId": {
        "value": "13187"
      }
    }
  },
  "sort": [
    {
      "rankValue": {
        "order": "desc"
      }
    }
  ], 
  "size": 10
}

4、refresh_interval 延时刷新

Elastic默认refresh_interval为1s,当添加文档、修改文档或删除文档后,立刻查询,此次的修改不会看到效果,在1s后查询才会看到。这就是Elastic的延时更新问题。有时业务需要在修改后,会立刻查询出修改后的结果,此时就对这个修改添加?refresh=wait_for参数,等待此次修改完刷新数据后返回修改结果。

4.1、创建索引时可指定refresh_interval

“settings”:{“index.refresh_interval”:“1s”}

4.2、Java 查询时指定

//设置refresh 策略
UpdateRequest updateRequest = new UpdateRequest(index, id);
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL);

//根据查询条件删除时,设置refresh=true
DeleteByQueryRequest deleteRequest = new DeleteByQueryRequest(index);
deleteRequest.setRefresh(refresh);

4.3、参考资料

Elasticsearch 删除数据出现“延迟”
refresh_interval属性是-1,意思是不刷新,一般不使用。

在index后有一个refresh_interval默认1秒,在这个时间间隔内search是不可见的。
解决办法有两种:
1,通过ui层解决。操作成功后只操作UI,而不是通过ES。
2,搜索时加上?refresh=wait_for,表示如果1秒内有请求立即更新并可见。

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/docs-refresh.html#docs-refresh
https://www.letianbiji.com/elasticsearch/es7-refresh-interval.html
https://www.cnblogs.com/smile361/p/7483561.html
https://elasticsearch.cn/question/7456

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值