目录
- 1 可能遇到的问题
- 2 Unknown key for a START_OBJECT in [XXXX].
- 3 TermQuery精确查询失效问题解决
- 4 Elasticsearch解决只能查询10000条数据方案
1 可能遇到的问题
一般我的习惯是先写javaAPI再去拿着代码中Debug数据进行排错,有的人喜欢先去写Es的请求然后在对应着javaAPI去写都可以。错误会不断补充建议收藏!
那么遇到的错误一般就是查不到,感觉逻辑很多就是找不到,但是这里的找不到分的种类就多了排查方式如下:
下断点找到对应调用SearchRequest.source将查询条件设置到检索请求
之后将其代码复制出来如何进行查询
这是正常操作排错也是按我这个步骤走
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用于关键词搜索.
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
}