query DSL (Domain Specific language)

Query String

查询所有:

GET /product/_search

带参数:

GET /product/_search?q=name:xiaomi

分页:

GET /product/_search?from=0&size=2&sort=price:asc

精准匹配 exact value

GET /product/_search?q=date:2021-06-01

_all搜索 相当于在所有有索引的字段中检索

GET /product/_search?q=2021-06-01
这里需要注意的是,当q=01 这样的查询条件是无法查到日期为01的date数据的,因为它没有倒排索引所分的词项,是精确匹配。text的数据存在倒排索引匹配。

  1. DELETE product
  2. # 验证_all搜索
  3. PUT product
  4. {
  5. "mappings": {
  6. "properties": {
  7. "desc": {
  8. "type": "text",
  9. "index": false
  10. }
  11. }
  12. }
  13. }
  14. # 先初始化数据
  15. POST /product/_update/5
  16. {
  17. "doc": {
  18. "desc": "erji zhong de kendeji 2021-06-01"
  19. }
  20. }

带body的查询

_source可以指定查询的字段
image.png
image.png
常用的过滤器规则,GET查询也可以使用

  • “_source”: “false”,
  • “_source”: “obj.*”,
  • “_source”: [ “obj1.“, “obj2.“ ],
  • “_source”: {
    “includes”: [ “obj1.“, “obj2.“ ],
    “excludes”: [ “*.description” ]
    }

全文检索-Fulltext query

  1. GET index/_search
  2. {
  3. "query": {
  4. ***
  5. }
  6. }

match:匹配包含某个term的子句

以下语句会进行全文检索,凡是存在xiaomi、nfc、phone的词项的doc都会被检索出来。
image.png

match_all:匹配所有结果的子句

查询所有doc,其实等同于GET product/_search
image.png

multi_match:多字段条件

query指定检索的词项
fields指定检索的字段
image.png

match_phrase:短语查询,

使用以下语句,必须包含检索短语的所有词项,且顺序不能颠倒
image.png

精准查询-Term query

term:匹配和搜索词项完全相等的结果

检索词并不会被分词,直接与词项匹配进行检索
image.png

  • term和match_phrase区别:
    match_phrase 会将检索关键词分词, match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的
    term搜索不会将搜索词分词
  • term和keyword区别
    term是对于搜索词不分词,
    keyword是字段类型,是对于source data中的字段值不分词

    terms:匹配和搜索词项列表中任意项匹配的结果

    相当于sql中的in
    image.png

    range:范围查找

    gte: 大于等于 、ge大于
    lte:小于等于、lt:小于
    image.png
    时区设置
    image.png

过滤器-Filter

和match相比,没有评分,效率高一点
image.png

  1. GET _search
  2. {
  3. "query": {
  4. "constant_score": {
  5. "filter": {
  6. "term": {
  7. "status": "active"
  8. }
  9. }
  10. }
  11. }
  12. }
  • filter:query和filter的主要区别在: filter是结果导向的而query是过程导向。query倾向于“当前文档和查询的语句的相关度”而filter倾向于“当前文档和查询的条件是不是相符”。即在查询过程中,query是要对查询的每个结果计算相关性得分的,而filter不会。另外filter有相应的缓存机制,可以提高查询效率。

组合查询-Bool query

bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值

  • must:必须满足子句(查询)必须出现在匹配的文档中,并将有助于得分。

满足所有子句,相当与and
image.pngimage.png

  • filter:过滤器 不计算相关度分数,cache☆子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。

也满足所有子句,但是没有评分
image.png

  • should:可能满足 or子句(查询)应出现在匹配的文档中。

image.png

  • must_not:必须不满足 不计算相关度分数 not子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。

相当not exists
image.png
minimum_should_match:参数指定should返回的文档必须匹配的子句的数量或百分比。如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0

组合进行查询
在组合查询的时候先使用filter不适用评分筛选一部分数据,然后其他子句再评分,排序等,会节省性能。filter也存在缓存,经常使用会加快速度
image.png