1 使用精确查询
使用QueryBuilders.termQuery()查询时,字段的数据类型可以是keyword,也可以是text但必须指定分词策略(例如:“ik_max_word"),注意这有坑。
例如,(1)在ES中使用QueryBuilders.termQuery("name", "雷锋网")搜索字段name中含有“雷锋网”的数据;
如果name字段的数据类型是"keyword",能够搜索出”雷锋网“数据;
如果name字段的数据类型是“text”,不能搜出”雷锋网“数据;
(2)在ES中使用QueryBuilders.termQuery("name", "雷锋")搜索字段name的内容;
如果name字段的数据类型是"keyword",不能够搜索出”雷锋网“数据;
如果name字段的数据类型是“text”,能搜出”雷锋网“数据;
因为keyword类型不分词,ES搜索的时候能够精确匹配到“雷锋网”;但是text类型,字段的内容会被分词为“雷锋”和“网”,则精确匹配无法找到“雷锋网”
2 ES中的sort排序
ES中使用searchSourceBuilder.sort("name", SortOrder.DESC)时,如果name字段是text类型必须开启 fielddata,而keyword可以直接用来排序,数值类型、日期类型的也可以直接排序。如果使用sort排序默认的排序方法将无效。
"name":{
"type": "text",
"fielddata": true
}
3 搜索特定时间的内容
使用searchSourceBuilder,.sort(new FieldSortBuilder("date").order(SortOrder.DESC))降序排序,排序规则会使用date字段的日期排序,此时使用boolQueryBuilder.filter(QueryBuilder.rangeQuery("date").gte(startYear).lte(endYear))会有坑。
例如:ES数据库里有较多的2016-2020年的数据,如果startYear=2016-01-01,endYear=2018-12-30,按照分页查询,可能搜索不到数据;如果startYear=2020-01-01,endYear=2020-12-30能搜索到数据,因为数据按照日期降序排序,数据的权重顺序从2020-2016,2020年的顺序靠前,所以第二种情况可以查到。根本原因是ES查询的时候,先依据sort排序,然后,才使用filter进行的查询