子句说明
查询query功能,是搜索语句中最基础,也是不可缺少的一部分。它表示在哪个索引字段下查询什么内容,并且可以指定多个查询条件及其之间的关系(AND \ OR \ ANDNOT \ RANK)。
例如可以将TEXT类型的title和subject 2个字段组合在一起,创建共同的索引default。此时通过default索引的查询,可以召回查询词命中了title或者subject原文的文档。
如果将 title字段,单独建立索引 title_search。那么在 title_search索引做查询时,只有查询词命中了title这个字段的原文,才能召回该文档。
语法说明
简单查询
查询语法:
query=索引名:'查询词'^boost 查询条件 索引名:'查询词'^boost
索引名:是在定义索引结构时,配置的索引信息。表示在指定索引字段包含的源字段上,查找包含“查询词”的文档。
查询词:表示要进行查询的内容。
boost:表示要设置的查询词权重,类型为int,范围为[0,99],不设置默认为99。
查询条件:查询条件可以为多个,支持关系主要有
()
、AND
、OR
、ANDNOT
、RANK
(必须大写),它们之间的优先级从低到高排列是:RANK,OR,AND,ANDNOT,()。AND: 表示两个查询词的交集,比如query=default:'手机' AND default:'蓝牙',表示查询包含“手机”和“蓝牙”同时出现的文档。
OR: 表示两个查询词的并集,比如query=default:'手机' OR default:'蓝牙',表示查询包含“手机”或者“蓝牙”的文档。
ANDNOT: 表示第一个查询成立并且第二个不成立的集合,比如query=default:'手机' ANDNOT default:'蓝牙',表示查询包含“手机”,并不包含“蓝牙”的文档。
RANK:表示第一个查询成立,并且第二个查询不一定成立的集合。比如query=default:'手机' RANK default:'蓝牙',表示查询包含“手机”的文档,文档并不一定包含“蓝牙”。该语法主要用于某些查询词不影响召回,只影响算分的场景,例如上面的例子中配合文本相关性计算可以实现优先将含有蓝牙的文档排在前面。
高级查询
多个查询词共用索引名
查询语法:
query=索引名:'查询词'^boost | '查询词'^boost
query=索引名:'查询词'^boost & '查询词'^boost
'|' 表示多个查询词之间是OR关系,'&'表示多个查询词是AND关系。
短语查询
查询语法:
query=索引名:"查询词"^boost 查询条件 索引名:"查询词"^boost
将“查询词”使用 ""
括起来进行查询,表示 phrase(短语)查询。即要求查询词分词后各个term的位置相连、顺序一致。
如果“查询词”使用
""
括起来进行查询,表示 phrase(短语)查询。即要求查询词分词后各个term的位置相连、顺序一致。range查询,包括地理位置分析和数值分析。
weakand查询
查询语法:
query=索引名:('查询词'||'查询词')^number
query=索引名:('查询词')^^number
weakand查询支持查询词比较长的场景下,返回部分词命中的文档,至少命中的词的个数通过query指定。最少命中词的个数有两种指定方式:一是在查询之前分好词的情况下通过'^'符号直接指定最少命中词的个数,二是由引擎自行分词,提前不知道具体分词个数时通过'^^'设置最小词命中的比例,为了满足分词之后词特别多的场景,这里的number是千分之几,即最小命中的词的个数为分词之后查询词个数*number/1000.0,然后线上取整。
weakand的查询性能介于全部AND和全部OR之间,最少命中词越多查询性能越好。
注意:weakand查询的功能默认未开启,如果需要使用的话可以联系技术支持。
地理位置查询:
查询语法:
query=索引名:'SHAPE(ARGS...)'
其中SHAPE(ARGS...)可以是:
点:point(LON LAT),注:LON表示经度,LAT表示纬度,中间是空格。
圆:circle(LON LAT,Radius),注:LON表示经度,LAT表示纬度,Radius是半径,单位:米。
矩形:rectangle(minLON minLAT,maxLON maxLAT),注:纬度上,maxY>=minY,如果写反了,会自动调整; 经度上,minX到maxX是由西向东理解的,如果写反了,代表的范围也就错了。
多边形:polygon(LON1 LAT1,LON2 LAT2,LON3 LAT3,LON4 LAT4,...),多边形可以是凸多边形或凹多边形;多边形起止点需要保证一致;相邻的两条边不能共线;多边形的边不允许自相交。
注意:
查询的索引必须是空间类型索引。
对Spatial索引的查询图形要使用单引号('')将其引起来,如:query=spatial_index:'circle(130.0 10.0,1000.0)'。
线和多边形的点坐标会映射到平面展开的世界地图上,以此确定线和多边形范围,不考虑跨180度经线的情况。location倒排的查询结果是精确的。line和polygon倒排的查询结果需要进行过滤。
数值范围查询:
查询语法:
query=索引名:(数值1,数值2]
数值1,数值2表示数值范围的起止值,支持数值范围查询的开闭区间查询,'('表示开区间,']'表示闭区间。
例子:
开区间查询:query = price:(3,100), 表示查询3<x<100的数据。
闭区间查询:query = price:[3,100],表示查询3<=x<=100的数据
半开半闭查询:query = price:(3,100],表示查询3<x<=100的数据。
起始值不指定:query=price:(, 100),表示查询x<100的数据。
注意:
查询索引必须为数值范围索引。
数值必须为整型,不支持浮点型。
日期(date)查询:
查询语法:
query=索引名:(起始时间,结束时间]
起止时间是一个整数类型的时间戳,精确到毫秒。如果起始时间不指定表示从0开始检索,如果结束时间不指定默认为4102416000000(2100-01-01 00:00对应的毫秒时间戳)。日期查询也支持日期的开闭区间查询。
注意:
查询索引必须为日期类型索引。
时间戳必须为整数,精确到毫秒,如果超过4102416000000,按照4102416000000处理。