match_all

使用match_all查询所有,默认只会返回10条数据。

GET /test1/_search
{
  "query": {
    "match_all": {}
  }
}

_search查询默认采用的是分页查询,每页记录数size的默认值为10。如果想显示更
多数据,指定size和from

GET /test1/_search
{
  "query": {
    "match_all": {}
  },
  "size": 20,
  "from": 1
}

size参数有限制,可以通过index.max_result_window来设置,但是对于翻页,ES中不推荐采用(from + size)方式进行深度分页。比如:from为1000000,size为10,逻辑意义是从满足条件的数据中取1000000到(1000000 + 10)的记录。这时ES一定要先将(1000000 + 10)的记录(即
result_window)加载到内存中,再进行分页取值的操作。尽管最后我们只取了10条数据返回给客户端,但ES进程执行查询操作的过程中确需要将(1000000 + 10)的记录都加载到内存中

推荐使用深分页查询Scroll

GET /test1/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "size":2
}


GET /_search/scroll
{
  "scroll": "1m",
  "scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFmNwcVdjblRxUzVhZXlicG9HeU02bWcAAAAAAABmzRY2YlV3Z0o5VVNTdWJobkE5Z3MtXzJB"
}

排序sort,会导致算分失效,因为已经是排序了

GET /test1/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": "desc"
    }
  ]
}

_source 在数组中用来指定展示那些字段

GET /test1/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name","sex"]
}

match

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找(查询关键字也会分词!)

match支持以下参数:
        query : 指定匹配的值
        operator : 匹配条件类型
        and : 条件分词后都要匹配
        or : 条件分词后有一个匹配即可(默认)
        minmum_should_match : 最低匹配度,即条件在倒排索引中最低的匹配度

//ik分词器下会搜索 长沙or广场 的记录
GET /test1/_search
{
  "query": {
    "match": {
      "address": "长沙广场"
    }
  }
}

//ik分词器下会搜索 长沙and广场 同时存在的记录
GET /test1/_search
{
  "query": {
    "match": {
      "address": {
        "query": "长沙广场",
        "operator": "and"
      }
    }
  }
}

//ik分词器下会搜索 广州or公园or哈哈 并且最少要匹配2个 的记录
GET /test1/_search
{
  "query": {
    "match": {
      "address": {
        "query": "广州公园哈哈",
        "minimum_should_match": 2
      }
    }
  }
}

ik_max_word分词分析

match_phrase

match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的。

multi_match

多字段检索,会按得分排序

GET /test1/_search
{
  "query": {
    "multi_match": {
      "query": "长沙张龙",
      "fields": ["address","name"]
    }
  }
}

query_string

不指定字段参数则全部字段中检索,并且可以在query中使用定AND | OR | NOT运算符

GET /test1/_search
{
  "query": {
    "query_string": {
      "fields": ["address"], 
      "query": "长沙 OR 张龙"
    }
  }
}

term

在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项

注意需要加xxx.keyword因为不加keyword的字段已经被分词了,会查不出结果

GET /test1/_search
{
  "query": {
    "term": {
      "address.keyword": {
        "value": "长沙橘子洲"
      }
    }
  }
}

fuzzy

在Elasticsearch中,我们可以使用fuzziness属性来进行模糊查询,从而达到搜索有错别字的情形。
fuzzy 查询会用到两个很重要的参数,fuzziness,prefix_length

fuzziness:表示输入的关键字通过几次操作可以转变成为ES库里面的对应field的字段(允许几个错字),范围0 - 2

prefix_length:表示限制输入关键字和ES对应查询field的内容开头的第n个字符必须完全匹配,不允许错别字匹配(限定开头字符),默认为0

GET /test1/_search
{
  "query": {
    "fuzzy": {
      "address": {
        "value": "长纱",
        "fuzziness": 1
      }
    }
  }
}

highlight

可以让符合条件的文档中的关键词高亮

highlight相关属性:
        pre_tags 前缀标签
        post_tags 后缀标签
        tags_schema 设置为styled可以使用内置高亮样式
        require_field_match 多字段高亮需要设置为false

GET /test1/_search
{
  "query": {
    "match": {
      "address": "长沙"
    }
  },
  "highlight": {
    "pre_tags": ["<font color='red'>"],
    "post_tags": ["</font>"], 
    "fields": {
      "address": {}
    }
  }
}