Es-Search Api 详解

  • URI-Search

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

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

      • term与phrase

        • alfred way等效于alfred OR way
        • "alfred way"词语查询,要求先后顺序
      • 泛查询 alfred等效于在所有字段去匹配该term

      • 指定字段 name:alfred

      • Group分组设定,使用括号指定匹配的规则

        • (quick OR brown) AND fox
        • status:(active OR pending) title:(full text search)
      • 布尔操作符

        • AND(&&), OR(|), NOT()
          • name:(tom NOT lee)
          • 注意大写,不能小写
        • +-分别对应must和must not
          • name:(tom +lee -alfred)
          • bname(lee && !alfred) l (tom && lee && !alfred))
        • +在url中会被解析为空格,要使用encode后的结果才可以,为%2B
    • 范围查询,支持数值和日期

      • 区间写法,闭区间用0 ,开区间用{}
        • 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)
    • 通配符查询

      • ?代表1个字符,*代表0或多个字符
        • name:t?m
        • name:tom*
        • name:t*m
      • 通配符匹配执行效率低,且占用较多内存,不建议使用 如无特殊需求,不要将?/*放在最前面
    • 模糊匹配fuzzy query

      • name:roam~ 1 匹配与roam差1个character的词,比如foam roams等 近似度查询proximity search
      • "fox quick"~5 以term为单位进行差异比较,比如"quick fox" "quick brown fox"都会被匹配
    • 正则匹配

      • name: /[mb]oat/
  • Request Body Search

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

      • query符合Query DSL语法的查询语句
      • from,size
      • timeout
      • sort
    • 基于JSON定义的查询语言, 主要包含如下两种类型:

      • 字段类查询 口如term, match, range等,只针对某一 个字段进行查询
      • 复合查询 如bool查询等,包含一 个或多个字段类查询或者复合查询语句
    • 字段类查询主要包括以下两类:

      • 全文匹配

        • 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_ phrase等query类型

        • 通过operator参数可以控制单词间的匹配关系,可选项为or和and

        • 通过minimum should match 参数可以控制需要匹配的单词数

      • 单词匹配

        • 不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term, terms,range等query类型
    • 相关性算分

      • 相关性算分是指文档与查询语句间的相关度,英文为relevance

        • 通过倒排索引可以获取与查询语句相匹配的文档列表,那么如何将最符合用户查询的需求的文档放到前列呢?
        • 本质是一个排序问题,排序的依据是相关性算分
      • 相关性算分的几个重要概念如下:

        • Term Frequency(TF)词频,即单词在该文档中出现的次数。词频越高,相关度越高
        • Document Frequency(DF)文档频率,即单词出现的文档数
        • Inverse Document Frequency(IDF)逆向文档频率,与文档频率相反,简单理解为1/DF。即单词出现的文档数越少,相关度越高
        • Field-length Norm文档越短,相关性越高
      • ES目前主要有两个相关性算分模型,如下:

        • TF/IDF模型

        • BM25模型5.x之后的默认模型

          BM25模型中BM指Best Match , 25指迭代了25次才计算方法,是针对TF/IDF的一个优化,其计算公式如下:

      • 可以通过explain参数来查看具体的计算方法,但要注意:

        • es的算分是按照shard进行的,即shard的分数计算是相互独立的,所以在使用explain的时候注意分片数
        • 可以通过设置索引的分片数为1来避免这个问题
    • Match Phrase Query

      • 对字段作检索,有顺序要求, API示例如下:

      • 通过slop参数可以控制单词间的间隔

    • Query String Query

      • 类似于URI Search中的q参数查询

    • Simple Query String Query

      • 类似Query String ,但是会忽略错误的查询语法,并且仅支持部分查询语法,其常用的逻辑符号如下,不能使用AND、OR、NOT等关键词:

        • +代指AND
        • |代指OR
        • -代指NOT
  • Term Query

    • 将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下所示:

    • 一次传入多个单词进行查询(Terms Query) ,如下所示:

      ![image-20190113203630267](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113203630267.png)

  • Range-Query

    • 范围查询主要针对数值和日期类型,如下所示:

    • 针对日期进行查询:

    • 针对日期提供的一-种更友好地计算方式(Date-Math),格式如下:

    • 单位有如下几种

      • y - years
      • M - months
      • W - weeks
      • d- days
      • h - hours
      • m - minutes
      • S- seconds
  • 复合查询

    • 复合查询是指包含字段类查询或复合查询的类型,主要包括以下几类:

      • constant_ score query
      • bool query
      • dis_ max query
      • function_ score query
      • boosting query
    • Constant Score Query

      • 该查询将其内部的查询结果文档得分都设定为1或者boost的值

        • 多用于结合bool查询实现自定义得分

    • Bool Query

      • 布尔查询由一个或多个布尔子句组成,主要包含如下4个:

      • Filter 查询只过滤符合条件的文档,不会进行相关性算分

        • es针对filter会有智能缓存,因此其执行效率很高
        • 做简单匹配查询且不考虑算分时,推荐使用filter替代query等
        • ![image-20190113205549381](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113205549381.png)
      • must

      • Must_not

        ![image-20190113205918544](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113205918544.png)

      • Should使用分两种情况:

        • bool查询中只包含should ,不包含must查询,只包含should时,文档必须满足至少一个条件,minimum should match可以控制满足条件的个数或者百分比

        • bool 查询中同时包含should和must查询,同时包含should和must时,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分

      • 当一个查询语句位于Query或者Filter上下文时, es执行的结果会不同,对此如下:

    • Count api

      • 获取符合条件的文档数, endpoint 为count

    • Source Filtering

      • 过滤返回结果中_source 中的字段,主要有如下几种方式:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值