elastic stack 那些事【4】

search api

实现对es中存储的数据进行查询分析,endpoint为_search,如 GET /_search
查询有两种形式

  1. URI search
  2. Request body search
    es 提供的完备的查询语法 Query DSL domain specific language

URI search

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

  1. q 指定查询的语句,语法为query string syntax
  2. df q 中不指定字段时默认查询的字段,如果不指定,es 会查询所有的字段
  3. sort 排序
  4. timeout 指定超时时间
  5. from size 分页

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

term and phrase

  1. alfred way 等于 alfred OR way
  2. "alfred way" 词语查询 要求先后顺序
    泛查询
  3. alfred 等效与在所有的字段取匹配该term
    在指定字段
  4. name:alfred

Group 分组

group分组设定,使用括号指定匹配规则

  1. (quick OR brown) AND fox
  2. status:(active OR pending) title:(full text search)

boolean 操作符

AND OR NOT

  1. name:(tom NOT leee)
  2. 必须大写

+-对应must 和 must_not

  1. name:(tom +lee -alfred)
  2. name:((lee && !alfred) || (tom && lee && !alfred))
    • 在url中会被解析为空格 要使用encode后结果才可以 %2B

范围查询

范围查询 支持数值和日期

  1. 区间写法 闭区间用[] 开区间用{}

    1. age:[1 TO 10]
    2. age:[1 TO 10}
    3. age:[1 TO] age>=1
    4. age:[* TO 10] age<=10
  2. 算数符号写法

    1. age:>=1
    2. age:(>=1 && <=10)
    3. age:(+>=1 +<=10)

通配符 正则表达式

  1. ?代表一个字符 * 代表0或者多个字符
  2. 通配符匹配执行效率低,占用内存大,不建议使用
  3. 如无特殊需求,不要将?/*放在最前
  4. name:/[ab]oat/ 正则表达的问题和通配符一样

模糊匹配 近似度查询

模糊匹配 fuzzy query

  1. name:roam~1 匹配与roam差一个character的词 例如 foam roams

近似度查询 proximity search

  1. "fox quick"~5 以 term为单位进行差异比较,例如"quick fox" "quick brown fox" 都会被匹配

Query DSL

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

  1. 字段类查询
    如 term match range 等 只针对某一个字段进行查询
  2. 复合查询
    如 boolean 查询 包含一个或多个字段类查询或者复合查询语句

字段类查询

  1. 全文匹配
    针对text类型的字段进行全文检索,回对查询语句进行分词处理,如match match_phrase 等query类型
  2. 单词匹配
    不会对查询语句做分词处理,直接去匹配字段的倒排索引 如 term terms range 等query类型
  3. minimum_should_match 控制需要匹配的单词数

相关性算分

指文档与查询语句间的相关度 relevance

  1. 通过倒排索引可以获取与查询语句项匹配的文档列表,那么如何将最符合用户查询需求的文档放在前列
  2. 本质是一个排序问题 排序的依据是相关性算分

相关性算分的几个重要概念

  1. term frequency 词频 即单词在该文档中出现的次数,词频越高 相关度越高
  2. document frequency df 文档频率,即单词出现的 文档数
  3. inverse document frequency idf 逆向文档频率 与 文档频率相反,简单理解为 1/df 单词出现的文档数越小,相关度越高
  4. field-length norm 文档越短 相关性越高

es 有两个算分模型

  1. tf/idf
  2. BM25 5.X以后默认

match phrase query

  1. 对字段进行检索,有顺序要求
  2. 使用slop参数控制单词之间的间隔

query string query

类似与uri search中的q参数查询

simple query string query

类似于query string 但是会忽略错误的查询语法,并且支持部分查询语法
常用的逻辑符号如下,不能使用 and or not 等关键词

    • 为 AND
  1. | 为 OR
    • 为 NOT

term query

一次传入多个单词 不做分词 查询

range query

数值和日期的范围查询

date math

针对日期提供一种更友好的计算方式
now - 1d
基准日期,也可以是更具体的日期,例如 2018-01-01 使用具体日期时 要用 || 做隔离
计算公式 主要有三种

    • 1h
    • 1d
  1. /d 将时间舍入到天

复合查询

包含字段类查询或复合类查询的类型

  1. constant_score query
    该查询将其内部的查询结果文档得分都设定为1 或者 boost的值
    多用于结合bool查询实现自定义得分
  2. bool query
    由一个或多个布尔子句组成,主要包含一下4个

    1. filter 值过滤复合条件的文档 不计算相关性得分

      1. es针对filer有只能缓存,提高效率
      2. 做简单的匹配查询且不考虑算分时,推荐使用filter替代query
    2. must 文档必须复合must中所有条件 会影响相关性得分
    3. must_not 文档必须不符合must_not中所有的条件
    4. should 文档可以复合should 中的条件,会影响相关性得分

count and source api

  1. count 获取复合条件的文档数
  2. source 只返回部分字段

你可能感兴趣的:(java)