关于java:elastic-stack-那些事4

28次阅读

共计 2270 个字符,预计需要花费 6 分钟才能阅读完成。

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 只返回局部字段

正文完
 0