当前位置:   article > 正文

elasticsearch 爬坑_querybuilders.wildcardquery

querybuilders.wildcardquery

实现一个根据条件删除数据的功能:

  1. BoolQueryBuilder query = QueryBuilders.boolQuery();
  2. query.must(QueryBuilders.termQuery("gameId", gameId));
  3. query.must(QueryBuilders.termQuery("serverId", serverId));
  4. query.must(QueryBuilders.termQuery("account", roleId));
  5. doSearchByBulkDelete(0, 10, query, -1);
  1. private void doSearchByBulkDelete(int form, int size, BoolQueryBuilder query, int totalHits) {
  2. SearchResponse res = transportClient.prepareSearch(String.format(INDEX_NAME, "*"))
  3. .setTypes(INDEX_TYPE)
  4. .setQuery(query)
  5. .setFrom(0)
  6. .setSize(size)
  7. .get();
  8. deleteRecord(res);
  9. int intValue = totalHits < 0 ? Long.valueOf(res.getHits().totalHits).intValue() : totalHits;
  10. int length = res.getHits().getHits().length;
  11. int total = form * size + length;
  12. if (total < intValue) {
  13. // 递归查询删除
  14. doSearchByBulkDelete(form + 1, size, query, intValue);
  15. }
  16. }

因为transportClient.prepareSearch()查询出默认只有前10条记录,如果记录大于10条,就需要多次查询删除动作

第一时间想到使用递归来完成查询删除的动作

junit debug运行完美确定全部删除,交付代码

 

和同事对接后,发生的妖怪的事情。。。每次调用doSearchByBulkDelete()方法时总是只删除了第一页的10条记录,后面的数据都在。。。。

然后在同事电脑上开启debug模式,结果还是可以成功处理,全部删除

 

然后各种百度。。。找不到对应的内容。。。算了。。。还是看看源码吧

transportClient.prepareSearch(String.format(INDEX_NAME, "*")) .setTypes(INDEX_TYPE) .setQuery(query) .setFrom(0) .setSize(size) .get();

发现get()方法内部的实现:

  1. public Response get() {
  2. return (ActionResponse)this.execute().actionGet();
  3. }

actionGet()再往下看:

  1. public interface ActionFuture<T> extends Future<T> {
  2. T actionGet();
  3. T actionGet(String var1);
  4. T actionGet(long var1);
  5. T actionGet(long var1, TimeUnit var3);
  6. T actionGet(TimeValue var1);
  7. }

问题好像明白了。。。原来是异步执行的。。。。

 

然后修改代码:

  1. BoolQueryBuilder query = QueryBuilders.boolQuery();
  2. query.must(QueryBuilders.termQuery("gameId", gameId));
  3. query.must(QueryBuilders.termQuery("serverId", serverId));
  4. query.must(QueryBuilders.termQuery("account", roleId));
  5. doSearchByBulkDelete(query);
  1. private void doSearchByBulkDelete(BoolQueryBuilder query) {
  2. long totalHits;
  3. int size = 10;
  4. do {
  5. SearchResponse res = transportClient.prepareSearch(String.format(INDEX_NAME, "*"))
  6. .setTypes(INDEX_TYPE)
  7. .setQuery(query)
  8. .setFrom(0)
  9. .setSize(size)
  10. .get();
  11. totalHits = res.getHits().totalHits;
  12. deleteRecord(res);
  13. } while (totalHits >= size);//只要有数据就一直重复执行
  14. }

提交代码对接测试。。。完美解决问题。。。

 

 

---- QueryBuilders.wildcardQuery("content", "*全*") 使用通配符不能查询到内容的爬坑

创建mapper时,content 的type设置为text,并且使用ik的分词器,导致wildcardQuery有些词可以查出,有些查不出

解决问题:

1:删除索引

2:重新创建索引,mapping,content的type设置为keyword

3:插入数据,查询。。。结果出来了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/698085
推荐阅读
相关标签
  

闽ICP备14008679号