Elasticsearch 查询详解

实现对es中存储的数据进行查询分析,以_search为结尾,查询主要有两种形式:

  • URI Search:操作简便,方便通过命令行测试,仅包含部分查询语法
  • Request Body Search:es提供完备查询语法Query DSL(Domain Specific Language)

URI Search详解


通过url query参数来实现搜索,常用参数如下:

  • q: 指定查询语句,语法为 Query String Syntax
  • df: q中不指定字段时默认查询的字段,如果不指定,es会查询所有字段
  • sort:排序
  • timeout:指定超时时间,默认不超时
  • from,size:用于分页

案例如下所示:

GET /myindex/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s
#查询user字段包含alfred的文档,结果按照age升序排列,返回第5-14个文档,如果超过1s没有结束,则以超时结束

Query String Syntax

  • 1.term与phrase
alfred way 等效于 alfred OR way
"alfred way" 词语查询,要求先后顺序
  • 2.泛查询
alfred等效于在所有字段去匹配该term
  • 3.指定字段name:alfred
  • 4.Group分组指定,使用括号指定匹配的规则
(quick OR brown) AND fox
status:(active OR pending) title:(full text search)
  • 5.布尔操作符
AND(&&),OR(||),NOT(!)
    name:(tom NOT lee) 注意大写,不能小写
+ - 分别对应must和must_not
    name:(tom +lee -alfred)
    name:((lee && !alfred)||(tom && lee && !alfred))

+ 在url中会被解析为空格,要使用encode后的结果才可以,为%2B

  • 6.范围查询,支持数值和日志

    • 区间写法,闭区间用[],开区间用{}
    age: [1 TO 10]意为 1<=age<=10
    age: [1 TO 10}意为 1<=age<10
    age: [1 TO ]意为 age>=1
    age: [* TO 10]意为 age<=10
    • 算数符号写法
      age:>=1
      age:(>=1&&<=10)或者age:(+>=1 +<=10)
  • 7.通配符查询:?代表一个字符,*代表0或多个字符
name:t?m
name:tom*

通配符匹配执行效率低,且占用较多内存,不建议使用
如无特殊需求,不要将?/*放在最前面
  • 8.正则表达式:name:/[mb]oat/
  • 9.模糊匹配 fuzzy query
name:roam~1
匹配与roam差一个character的词,比如foam roams等
  • 10.近似度查询 proximity search
"fox quick"~5
以term为单位进行差异比较,比如"quick fox" "quick brown fox"都会被匹配

示例说明:

GET /myindex/_search?q=username:alfred way
{
  "profile": "true"
}

#其中alfred为指定username字段查询,way为泛查询


如果想在指定字段中查询,可以改为如下语句:
GET /myindex/_search?q=username:"alfred way"
GET /myindex/_search?q=username:(alfred way)

GET /myindex/_search?q=username:(alfred +way) (包含alfred或者包含way)+被解析为空> > 格,需要改为如下形式
GET /myindex/_search?q=username:(alfred %2Bway)(必须包含way,可以有alfred)


userna:alfred AND way 和userna:(alfred AND way)的查询语法完全不同,前者包含一个泛查> 询
可以通过{"profile": "true"}查看查询语法。

Request Body Search


将查询语句通过http request body 发送到es,主要包含如下参数:

  • query: 符合Query DSL语法的查询语句
  • from,size
  • timeout
  • sort

Query DSL

Query DSL: 基于json定义的查询语言,主要包含如下两种类型:

  • 字段类查询:如term、match、range等,只针对某一字段进行查询
  • 复合查询:如bool查询等,包含一个或多个字段类查询或者复合查询语句

match查询示例:

GET my_index/_search
{
  "query": {
    "match": {
      "username": "alfred way"
    }
  }
}

字段类型的查询


  • 全文匹配:针对text类型字段进行全文检索,对语句先进行分词,如match,match_phrase

matchoperator参数,可选项为and和or;minimum_should_match: 需要匹配的单词数
match_phrase:词语查询
slop参数:控制单词的间隔数(差异数)
query_string:类似于url中的q参数查询
simple_query_string:会忽略错误的查询语法,并且仅支持部分查询语法,不能使用AND,OR,NOT,要用+,|,-代替

  • 单词匹配:不会进行分词处理,直接匹配倒排索引,如term,terms,range
    term;terms:一次传入多个参数进行查询
    range:gt,gte,lt,lte
    日期: gte:"1999-02-01" 计算: +1h -1d /d(将时间舍入到天)
    或者 gte:"now-20y"(也可以用具体的日期 "2018-01-01",使用的时候用 ||做隔离)
    2018-01||+1M/d

复合查询


  • constant_score :将内部查询结果的文档得分设定为1或者boost的值
    一般用于结合bool查询实现自定义得分
  • bool :一个或者多个bool字句组成
  • filter,只过滤符合条件的文档,不计算相关得分(对性能提升有用,做简单查询的时候,推荐使用filter替代query
  • must,文档必须符合must中的条件,会影响相关性得分
  • must_not,文档必须不符合must_not中的所有条件
  • should,文档可以符合should中的条件,会影响得分,一般两种形式:
    • (1)只包含should,不包含must:文档必须满足至少一个条件
      minimum_should_match:控制满足的个数或者百分比
    • (2)同时包含shouldmust:不必满足条件,如果满足,会有加分
  • dis_max
  • function_score
  • boosting

猜你喜欢

转载自blog.csdn.net/qq_34646817/article/details/82592754