- 简介
- 查询语法
- 源码分析
简介
范围搜索匹配某个域上的值在一定范围的文档。范围查询可以包含或者不包含最大值和最小值,排序是按照字典顺序来排序的。范围查询使我们能够找到某一字段值在某个范围里的文档,字段可以是数值型,也可以是基于字符串的(将映射到一个不同的Apache Lucene查询)。
范围查询只能针对单个字段,查询参数应封装在字段名称中。
查询语法
例:查找year字段从1700到1900的所有图书
{
“query” : {
“range” : {
“year” : {
“gte” : 1700,
“lte” : 1900
}}}}
范围查询支持以下参数。
gte:范围查询将匹配字段值大于或等于此参数值的文档。
gt:范围查询将匹配字段值大于此参数值的文档。
lte:范围查询将匹配字段值小于或等于此参数值的文档。
lt:范围查询将匹配字段值小于此参数值的文档。
源码分析
'''(1)Elasticsearch code'''
public class RangeQueryParser implements QueryParser {
public static final String NAME = "range";
@Override
public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
XContentParser parser = parseContext.parser();
XContentParser.Token token = parser.nextToken();
if (token != XContentParser.Token.FIELD_NAME) {
throw new QueryParsingException(parseContext.index(), "[range] query malformed, no field to indicate field name");
}
String fieldName = parser.currentName();
token = parser.nextToken();
if (token != XContentParser.Token.START_OBJECT) {
throw new QueryParsingException(parseContext.index(), "[range] query malformed, after field missing start object");
}
Object from = null;
Object to = null;
boolean includeLower = true;
boolean includeUpper = true;
float boost = 1.0f;
String currentFieldName =