转载自:ES基本查询语句教程 - @ 小浩 - 博客园

python操作ES查询

连接ES数据库:

from elasticsearch import Elasticsearch

es = Elasticsearch([{"host":"ip","port":9200}])

es.search(index='es_python')         # index:选择数据库

1.ES是基于Apache Lucene的开源分布式(全文)搜索引擎。

es除了全文搜索引擎之外,还可以这样描述它:
1、分布式的实时文件存储,每个字段都被索引并可被搜索
2、分布式的实时分析搜索引擎
3、可以扩展到成百上千台服务器,处理PB级结构化或非结构化数据。

  • ES的数据组织类比

Relational DBElasticsearch
数据库(database)索引(indices)
表(tables)types
行(rows)documents
字段(columns)fields

2.查询

2.1查询指定索引信息

 GET test

2.2查询指定文档信息

GET test/doc/1

2.3查询对应索引下所有数据

GET test/doc/_search

GET test/doc/_search

{

        "query":{    "match_all":{}   }

}

2.4ES 查询字符串搜索

GET test/doc/_search?q=name:zhangsan

2.5结构化查询(单字段查询,不能多字段组合查询)

GET test/doc/_search { 

"query":{     "match":{   "name":"wang"   }    }

}

3.match系列操作

3.1 match_all(查询全部)

GET test/doc/_search

{

        "query":{"match_all":{}}

}

3.2 match_phrase(短语查询)

GET test1/doc/_search

{

      "query":{

            "match":

                    {"title":"中国"}

    }

}

elasticsearch在内部对文档做分词的时候,对于中文来说,就是一个字一个字分的,所以,我们搜中国,中和国都符合条件,返回,而美国的国也符合。而我们认为中国是个短语,是一个有具体含义的词。所以elasticsearch在处理中文分词方面比较弱势。后面会讲针对中文的插件。但目前我们还有办法解决,那就是使用短语查询 用match_phrase

GET test1/doc/_search

{

        "query":{

                  "match_phrase": { "title": "中国" }

            }

}

如果我们搜索中国和世界这两个指定词组时,但又不清楚两个词组之间有多少别的词间隔。那么在搜的时候就要留有一些余地。这时就要用到了slop了。相当于正则中的中国.*?世界。这个间隔默认为0

GET test1/doc/_search

{

      "query":{

             "match_phrase": { "title":

                               { "query": "中国世界", "slop":2 }

                    }

          }

}

3.3match_phrase_prefix(最左前缀查询)只能搜索--以xx开头

数据准备

PUT test2/doc/1 { "title": "prefix1", "desc": "beautiful girl you are beautiful so" }

PUT test2/doc/2 { "title": "beautiful", "desc": "I like basking on the beach" }

GET test2/doc/_search

{

        "query": {

                 "match_phrase_prefix": { "desc": "bea" }

          }

}

3.4 multi_match(多字段查询)

multi_match是要在多个字段中查询同一个关键字 除此之外,mulit_match甚至可以当做match_phrase和match_phrase_prefix使用,只需要指定type类型即可

GET test2/doc/_search {

          "query": {

                 "multi_match": {

                        "query": "beautiful",

                        "fields": ["title","desc"]

                   }

            }

}

当设置属性type:phrase时,等同于短语查询

GET test1/doc/_search

{

       "query": {

               "multi_match": {

                         "query": "中国",

                         "fields": ["title"],

                          "type": "phrase"

                 }

         }

}

当设置属性type:phrase_prefix时等同于 最左前缀查询

GET test2/doc/_search

{

      "query": {

             "multi_match": {

                     "query": "bea",

                     "fields": ["desc"],

                     "type": "phrase_prefix"

              }

        }

}

match 查询相关总结

1、match:返回所有匹配的分词。

2、match_all:查询全部。

3、match_phrase:短语查询,在match的基础上进一步查询词组,可以指定slop分词间隔。

4、match_phrase_prefix:前缀查询,根据短语中最后一个词组做前缀匹配,可以应用于搜索提示,但注意和max_expanions搭配。其实默认是50

5、multi_match:多字段查询,使用相当的灵活,可以完成match_phrase和match_phrase_prefix的工作。

四、ES的排序查询

es 6.8.4版本中,需要分词的字段不可以直接排序,比如:text类型,如果想要对这类字段进行排序,需要特别设置:对字段索引两次,一次索引分词(用于搜索)一次索引不分词(用于排序),es默认生成的text类型字段就是通过这样的方法实现可排序的。

GET test/doc/_search

{ "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ] }

升序:asc

五、ES的分页查询

from:从哪开始查        size:返回几条结果

GET test/doc/_search

{

       "query": {

               "match_phrase_prefix": { "name": "wang" }

         },

         "from": 0, "size": 1

}

六、ES的bool查询 (must、should)

must (must字段对应的是个列表,也就是说可以有多个并列的查询条件,一个文档满足各个子条件后才最终返回)

#### 单条件查询

GET test/doc/_search

{

      "query": {

               "bool": {

                       "must": [

                                { "match": { "name": "wangfei" } }

                         ]

                 }

        }

}

 

 

bool查询总结

must:与关系,相当于关系型数据库中的 and。

should:或关系,相当于关系型数据库中的 or。

must_not:非关系,相当于关系型数据库中的 not。

filter:过滤条件。

range:条件筛选范围。

gt:大于,相当于关系型数据库中的 >。

gte:大于等于,相当于关系型数据库中的 >=。

lt:小于,相当于关系型数据库中的 <。

lte:小于等于,相当于关系型数据库中的 <=。

 八、ES之查询结果高亮显示

 九、ES之精确查询与模糊查询

 term查询查找包含文档精确的倒排索引指定的词条。也就是精确查找。

term和match的区别是:match是经过analyer的,也就是说,文档首先被分析器给处理了。根据不同的分析器,分析的结果也稍显不同,然后再根据分词结果进行匹配。term则不经过分词,它是直接去倒排索引中查找了精确的值了。

十、ES的聚合查询avg、max、min、sum

上例中,首先匹配查询from是gu的数据。在此基础上做查询平均值的操作,这里就用到了聚合函数,其语法被封装在aggs中,而my_avg则是为查询结果起个别名,封装了计算出的平均值。那么,要以什么属性作为条件呢?是age年龄,查年龄的什么呢?是avg,查平均年龄。

如果只想看输出的值,而不关心输出的文档的话可以通过size=0来控制

 

 

 十一、ES的分组查询

 

上例中,在aggs的自定义别名age_group中,使用range来做分组,field是以age为分组,分组使用ranges来做,from和to是范围

 

ES的聚合查询的总结:聚合函数的使用,一定是先查出结果,然后对结果使用聚合函数做处理

avg:求平均

max:最大值

min:最小值

sum:求和

must和should嵌套使用
"query": {
    "bool": {
        "must": [
            {
                "bool": {
                    "should": [
                        {"match": {"look_user": "test1"}},
                        {"match": {"userId": "test2"}}
                    ]
                }
            },
            {"terms": {"status": 1}},
            {"match": {"verify": 2}}
        ]
    }
}

意义:表示(look_user=test1 or userId=test2) and status = 1 and verify = 2
分组统计
单值统计
{
    "size": 0,
    "aggs": {
        "name_type": {
            "terms": {
                "field": "class"
            }
        }
    }
}

意义:按字段名class分组统计。
多层嵌套统计
{
    "size": 0,
    "aggs": {
        "name_type": {
            "terms": {
                "field": "class"
            },
            "aggs": {
                "_B_": {
                    "terms": {
                        "field": "tag"
                    }
                }
            }
        }
    }
}
意义:按字段名class和tag分组统计。

使用sql语句查询:

POST /_xpack/sql?format=txt
{
  "query":"select * from index_test where id='123' "
}

format类型有:json,yaml,smile,cbor,txt,csv,tsv

Elasticsearch SQL - 卡布爱学习 - 博客园
———————————————
版权声明:本文为CSDN博主「风过灬无痕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35129353/article/details/117064960

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐