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 }
5 queryStringQuery精确精确查询
一般需要精确查询的字段,在存储的时候都不建议分词。但是已经分词了,还想精确精确查询,使用queryStringQuery,在需要精确查询的词语外面使用双引号引起来
queryStringQuery("""+words+""").field("prod_name")
6 修改ignore_above字符大小或修改mappings
PUT common_index/_mappings { "properties" : { "ocrContent" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 111 } } } } }