目录


1 可能遇到的问题


一般我的习惯是先写javaAPI再去拿着代码中Debug数据进行排错,有的人喜欢先去写Es的请求然后在对应着javaAPI去写都可以。错误会不断补充建议收藏!


那么遇到的错误一般就是查不到,感觉逻辑很多就是找不到,但是这里的找不到分的种类就多了排查方式如下:

下断点找到对应调用SearchRequest.source将查询条件设置到检索请求

Elasticsearch常见错误及如何排查错误_大数据

之后将其代码复制出来如何进行查询

Elasticsearch常见错误及如何排查错误_elasticsearch_02

这是正常操作排错也是按我这个步骤走

Elasticsearch常见错误及如何排查错误_大数据_03

2 Unknown key for a START_OBJECT in [XXXX].

{
"range": {
"id": {
"gte": 3000000000,
"lte": 4000000000
}
},
"size": 1
}

range 是query中的元素,应该放在query中,不论是什么查询都需要放入query中

{
"query": {
"range": {
"id": {
"gte": 3000000000,
"lte": 4000000000
}
}
},
"size": 1
}

3 TermQuery精确查询失效问题解决

3.1 问题

TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("filename",name);

查询的时候要么就是没有,要么就是结果很奇怪。关于这个debug也debug了,逻辑代码也没啥问题。后来查了很多资料终于找到了解决办法。

3.2 解决办法

将字段的type设置为keyword,即

TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("filename.keyword",name);

问题解决。

3.3 原因

term做精确查询可以用它来处理数字,布尔值,日期以及文本。查询数字时问题不大,但是当查询字符串时会有问题。term查询的含义是termQuery会去倒排索引中寻找确切的term,但是它并不知道分词器的存在。term表示查询字段里含有某个关键词的文档,terms表示查询字段里含有多个关键词的文档。也就是说直接对字段进行term本质上还是模糊查询,只不过不会对搜索的输入字符串进行分词处理罢了。

​如果想通过term查到数据,那么term查询的字段在索引库中就必须有与term查询条件相同的索引词,否则无法查询到结果。​

如果是text用于全文搜索,会分词,而keyword用于关键词搜索.

Elasticsearch常见错误及如何排查错误_大数据_04

4 Elasticsearch解决只能查询10000条数据方案

es官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:

Result window is too large, from + size must be less than or equal to

但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。

解决方案:

第一种办法.在kibana中执行,解除索引最大查询数的限制

put _all/_settings
{
"index.max_result_window":200000
}

_all表示所有索引,针对单个索引的话修改成索引名称即可

第二种办法:在创建索引的时候加上

“settings”:{
"index":{
"max_result_window": 500000
}
}

但是修改完之后,通过api查询回来的totalhits还是只有10000条,解决如下 :

在查询时候把 track_total_hits 设置为 true。

track_total_hits 设置为false禁用跟踪匹配查询的总点击次数

设置为true就会返回真实的命中条数。

java代码在构建条件时候加上:

searchSourceBuilder.trackTotalHits(true);

kibana查询

GET 索引名/_search
{
"query": {
"match_all": {}
},
"track_total_hits":true
}