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 DB | Elasticsearch |
---|---|
数据库(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