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": {}
}
}
}