Elasticsearch常用错误及如何排查错误

目录


1 可能遇到的问题

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

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

下断点找到对应调用SearchRequest.source将查询条件设置到检索请求
Elasticsearch常用错误及如何排查错误

之后将其代码复制出来如何进行查询
Elasticsearch常用错误及如何排查错误
这是正常操作排错也是按我这个步骤走
Elasticsearch常用错误及如何排查错误

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常用错误及如何排查错误

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
	}
上一篇:elasticsearch算法之词项相似度算法(一)


下一篇:elasticsearch过滤