query子句

子句说明

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

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

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

语法说明

查询条件格式如下:

普通查询:index:'查询词'^boost

Range范围查询index:'circle(经度值 纬度值,半径值)'

Range范围查询index:[数值1,数值2]

  • index(索引字段):是在定义索引结构时,配置的索引信息。表示在指定索引字段包含的源字段上,查找包含“查询词”的文档。

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

  • boost:表示要设置的查询词权重,类型为int,范围为[0,99],不设置默认为99。需要在粗排表达式中配置exact_match_boost()才能生效,该功能可选。

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

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

  • Range范围查询,包括地理位置分析和数值分析。

注意事项

  • query子句为必选子句,不能为空

  • ANDNOT 连接符不能单独使用,并且ANDNOT 连接符左边连接的查询不能为null,即index_name:''

  • 若RANK未放置在句末,例:index1:'xxx' RANK index2:'xxx' AND index3:'xxx' 则RANK需要和其他条件用()绑定,即(index1:'xxx' RANK index2:'xxx') AND index3:'xxx',否则RANK后的连接条件将全部参与RANK,即index1:'xxx' RANK (index2:'xxx' AND index3:'xxx')

  • 查询词必须要用单(双)引号括起来,否则查询报错无结果或行为不可预期。

  • 只有 TEXTSHORT_TEXT 类型的字段,可以建立组合索引。

  • boost 值小于0则按照0计算,大于99按照99计算。

  • 关于各种类型的搜索含义,详情请参见文本分析器介绍。

示例

  1. 查询title索引字段中包含“北京大学”的文档:

    query=title:'北京大学'
  2. 查询title索引字段中包含“北京大学”的文档,并且包含“浙江大学”的文档:

    query=title:'北京大学' AND title:'浙江大学'
  3. 查询title索引字段中包含“北京大学”或者“浙江大学”,且type为“1”的文档:

    query=(title:'北京大学' OR title:'浙江大学') AND type:'1'
  4. 查询title索引字段中包含“北京大学”或者“浙江大学”,OR语法的其他写法

    query=title:'北京大学'|'浙江大学'
  5. 查询title索引字段中包含北京大学且不包含清华的文档,若title中包含校长则排序上排在前面:

    query=(title:'北京大学' ANDNOT title:'清华') RANK title:'校长'
    // 精排表达式为:text_relevance(title)
  6. 查询title索引字段中包含北京大学的文档,要求北京大学不能分开,不希望返回类似“北京的大学”的文档:

    query=title:"北京大学"
  7. 数组类型搜索:

    //假设有一个int arr类型字段,设置为索引arr_index_1
    //表示数组元素有值为1记录就会被召回
    query=arr_index_1:'1'