Elasticsearch 搜索API

115 阅读1分钟

1. search api

  • 在url中使用查询参数

  • request body search

    • 使用es提供的,基于json格式的更加完备的 query domain specific language (dsl)
      

2. 指定查询的索引

image.png

3. 返回response

image.png

  1. uri search - 通过uri query实现搜索 GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s {"profile":true}
  • q 指定查询语句,使用query string syntax

  • df 默认字段,不指定时,会对所有字段进行查询,或者 q=title:2012

  • sort 排序

  • form、size 用于分页

  • profile 可以查看查询是如何被执行的

5. query string syntax

  • 指定字段 vs 泛查询

    • q=title:2012 / q=2012
  • term vs phrase

    • beautiful mind 等效于 beautiful or mind,q=title(beautiful mind),不加()则mind则是泛查询

    • “beautiful mind” 等效于 beautiful and mind。 phrase 查询,还要求前后顺序保持一致, q=title:"beautiful mind"

  • 分组与引导

    • title:(beautiful and mind)

    • title=“beautiful mind”

  • 布尔操作

    • AND / OR / NOT 或者 && // || / !

    • 必须大写

    • title:(beautiful NOT mind) ,包含beautiful 但是不包含 mind

  • 分组

    • “+” 表示 must ,在uri中使用%2B来表示+号

    • “-” 表示 must not

    • title:(+beautiful - mind)

  • 范围查询

    • 区间表示:[]闭区间,{}开区间

    • year:{2010 TO 2018}

    • year:[* TO 2018]

  • 算数符号

    • year:>2010

    • year:(>2010 && <=2018)

    • year:(+>2010 +<=2018)

  • 通配符查询(效率低,占用内存大,不建议使用,特别是放在最前面)

    • ?代表1个字符,*代表0或者多个字符

    • title:mi?d

    • title:bea* 均不是phrase查询

  • 正则表达

    • title:[bt]oy
  • 模糊查询与近似查询

    • title:befutifl~1

    • title:"lord rings"~2(~2代表的是lord 与 rings之间的距离是2)

6. request body查询

  • sort 排序

    • 最好在“数字型”与“日期型”字段进行排序

    • 因为对于多值类型或分析过的字段排序,系统会选一个值,无法得知该值

    • _search {"sort":[{"order_date":"desc"}]}

  • _source 只查询出我们想要的字段

    • 如果_source没有存储,那就只能返回匹配的文档的元数据

    • _source支持使用通配符 _source["name*","desc*"]

    • _search {"_source":["order_date","name"]}

  • 脚本字段,新增一个字段,自定义值

    • _serach {"script_fields":{"new_field":{"script":{"lang":"painless","source":"doc['order_date'].vaule+'_hello'"}}}}

    • 比如订单中对汇率进行脚本计算后排序

  • match query

    • _search {"query":{"match":{"comment":"last christmas"}}} 默认是last or christmas

    • _search {"query":{"match":{"comment":"last christmas","operator":"AND"}}},指的是last and christmas

  • match phrash

    • _search {"query":{"match_phrase":{"comment":{"query":"song last christmas","slop":1}}}}, 使用match_phrase 查询,这些词是要顺序出现的,slop 1 代表中间可以有1个词的间距

7. query string 类似url query

  • post users/_search {"query":{"query_string":{"default_field":["name","about"],"query":"ruan AND yiming"}}} AND 在查询中是“与”的意思

8. simple query string

  • post users/_search {"query":{"simple_query_string":{"query":"ruan -yiming","fields":["name"],"default_operator":"AND"}}}

    • 类似 query string,但是会忽略错误的语法,同时只支持部分查询语法

    • 不支持AND OR NOT,会当做字符串处理,term之间默认关系是OR,可以指定operator

  • 支持部分逻辑

    • +代替AND

    • |代替OR

    • -代替NOT

9. 结构化数据

  • 结构化搜索是对结构化数据的搜索

    • 日期、布尔类型和数字都是结构化的
  • 文本也可以是结构化的。

    • 如彩色笔有离散的颜色集合:红(red)、绿(green)、蓝(blue)

    • 一个博客可能被标记了标签,例如,分布式(distributed)和搜索(search)

  • 如果不需要算分,可以通过Constant Score,将查询转为Filtering

  • 使用Exist查询处理非空NULL值,

image.png