query子句

子句说明

查询query功能,是搜索语句中最基础,也是不可缺少的一部分。它表示在哪个索引字段下查询什么内容,并且可以指定多个查询条件及其之间的关系(AND \ OR \ ANDNOT \ RANK)。

例如可以将TEXT类型的title和subject 2个字段组合在一起,创建共同的索引default。此时通过default索引的查询,可以召回查询词命中了title或者subject原文的文档。

如果将 title字段,单独建立索引 title_search。那么在 title_search索引做查询时,只有查询词命中了title这个字段的原文,才能召回该文档。

语法说明

{
  "query": ""
}

query子句是一个必选子句,它的内容是待查询的索引与查询词组成的字符串,例如 title:'开放搜索' AND tag:'1',具体的查询拼接语法请参考简单查询高级查询部分。

简单查询

查询语法:

索引名:'查询词'^boost 查询条件 索引名:'查询词'^boost
  • 索引名:是在定义索引结构时,配置的索引信息。表示在指定索引字段包含的源字段上,查找包含“查询词”的文档。

  • 查询词:表示要进行查询的内容。

  • boost:表示要设置的查询词权重,类型为int,范围为[0,99],不设置默认为99。

  • 查询条件可以为多个,支持关系主要有 ()ANDORANDNOTRANK (必须大写),它们之间的优先级从低到高排列是:RANK,OR,AND,ANDNOT,()。

    • AND 表示两个查询词的交集,比如default:'手机' AND default:'蓝牙',表示查询包含“手机”和“蓝牙”同时出现的文档。

    • OR 表示两个查询词的并集,比如default:'手机' OR default:'蓝牙',表示查询包含“手机”或者“蓝牙”的文档。

    • ANDNOT 表示第一个查询成立并且第二个不成立的集合,比如default:'手机' ANDNOT default:'蓝牙',表示查询包含“手机”,并不包含“蓝牙”的文档。

    • RANK 表示第一个查询成立,并且第二个查询不一定成立的集合。比如default:'手机' RANK default:'蓝牙',表示查询包含“手机”的文档,文档并不一定包含“蓝牙”。该语法主要用于某些查询词不影响召回,只影响算分的场景,例如上面的例子中配合文本相关性计算可以实现优先将含有蓝牙的文档排在前面。

高级查询

多个查询词共用索引名

查询语法:

索引名:'查询词'^boost | '查询词'^boost
 索引名:'查询词'^boost & '查询词'^boost

'|' 表示多个查询词之间是OR关系,'&'表示多个查询词是AND关系。

短语查询

查询语法:

索引名:"查询词"^boost 查询条件 索引名:"查询词"^boost 

将“查询词”使用 "" 括起来进行查询,表示 phrase(短语)查询。即要求查询词分词后各个term的位置相连、顺序一致。

  • 如果“查询词”使用 "" 括起来进行查询,表示 phrase(短语)查询。即要求查询词分词后各个term的位置相连、顺序一致。

  • range查询,包括地理位置分析和数值分析,具体用法请点击此处。

  • 在最终生成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倒排的查询结果需要进行过滤。

数值范围查询:

查询语法:

索引名:(数值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查询:

查询语法:

索引名:(起始时间,结束时间]

起止时间是一个整数类型的时间戳,精确到毫秒。如果起始时间不指定表示从0开始检索,如果结束时间不指定默认为4102416000000(2100-01-01 00:00对应的毫秒时间戳)。日期查询也支持日期的开闭区间查询。

注意:

  • 查询索引必须为日期类型索引。

  • 时间戳必须为整数,精确到毫秒,如果超过4102416000000,按照410241600000