社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

Elasticsearch(ES)的高级搜索(DSL搜索)(上篇)

追风人聊Java • 4 年前 • 392 次点击  

1. 概述

之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成。

2. 场景说明

2.1 创建索引同时创建映射

PUT http://192.168.1.11:9200/index_user

参数:

{
    "settings":{
        "index":{
            "number_of_shards":5,
            "number_of_replicas":0
        }
    },
    "mappings" : {
        "properties":{
            "user_id":{
                "type":"long"
            },
            "name":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "login_name":{
                "type":"keyword"
            },
            "age":{
                "type":"integer"
            },
            "birthday":{
                "type":"date"
            },
            "desc":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "head_url":{
                "type":"text",
                "index":false
            }
        }
    }
}

2.2 创建文档

此处只举几个例子

POST http://192.168.1.11:9200/index_user/_doc/1

参数:

{
    "user_id":"1",
    "name":"僵尸猎手",
    "login_name":"jsls",
    "age":25,
    "birthday":"1990-03-01",
    "desc":"我是一名房产经纪人,现在转行了,目前是一名运输工人",
    "head_url":"https://www.zhuifengren.cn/img/jsls.jpg"
}

POST http://192.168.1.11:9200/index_user/_doc/2

参数:

{
    "user_id":"2",
    "name":"夏维尔",
    "login_name":"xwe",
    "age":28,
    "birthday":"1992-06-06",
    "desc":"我是一名高级开发经理,每天坐地铁上班,在北京住,从不堵车",
    "head_url":"https://www.zhuifengren.cn/img/xwe.jpg"
}

POST http://192.168.1.11:9200/index_user/_doc/3

参数:

{
    "user_id":"3",
    "name":"迪士尼在逃仙柔",
    "login_name":"dsnzxr",
    "age":10,
    "birthday":"2011-06-22",
    "desc":"我是一名五年级的小学生,每天专车接专车送,中午在学校入伙,食堂菜可好了,上学期期末考试我拿了三好学生奖",
    "head_url":"https://www.zhuifengren.cn/img/dsnzxr.jpg"
}

……………………

3. 高级搜索(DSL搜索)(上篇)

3.1 在url中指定查询条件(非DSL搜索)

GET http://192.168.1.11:9200/index_user/_doc/_search?q=desc :一名&q=age:10

desc 是索引中的一个字段,一名 是需要检索的关键字

age 是索引中的一个字段,10是要查的值

此方式用的比较少。

3.2 DSL基本查询

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match":{
            "desc":"一名"
        }
    }
}

3.3 文档中是否存在某字段

文档中存在该字段,就会被查出来

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "exists":{
            "field":"name"
        }
    }
}

3.4 查询所有

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

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

3.5 查询部分字段

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match_all":{}
    },
    "_source": [
        "user_id",
        "name"
    ]
}

3.6 分页

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match_all":{}
    },
    "from":0,   // 从哪条文档开始,文档下标从 0 开始
    "size":10   // 每页多少条文档
}

3.7 term查询

term查询,不会将关键字分词,直接拿来查询。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "term":{
            "desc":"一名"
        }
    }
}

3.8 match查询

match查询,会将关键字先分词,然后用每一个分词去查询,最后将结果取并集。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match":{
            "desc":"一名小学生"
        }
    }
}

3.9 terms查询

与term查询类似,可以写多个关键字,会用每个关键字去查询,最后将结果取并集。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "terms":{
            "desc":[
                "一名",
                "小学生"
            ]
        }
    }
}

3.10 match_phrase查询

与match类似,会先将关键字分词,然后用每个分词去查询,但会对文档中分词间的间隔有一定限制,使用slop属性去限制,默认是0,需要小于设置的间隔,才能匹配文档。

例如:slop设置为0,则两个分词在文档中的位置必须是紧挨着,否则无法命中。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match_phrase":{
            "desc":{
                "query": "一名 学生",
                "slop":8
            }
        }
    }
}

3.11 match查询扩展

1)match查询后,结果取交集

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match":{
            "desc": {
                "query": "一名小学生",
                "operator": "and"
            }
        }
    }
}

2)指定匹配率

指定为整数,意思是文档匹配分词的最小个数,例如设置为3,意思是有关键字中3个分词命中文档就可以被查出来。

指定为百分比,意思是匹配关键字分词的百分比,例如设置为60%,如果关键字分词数量是4,则匹配的关键字分词数除以总数大于60%就可以被查出来。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "match":{
            "desc": {
                "query": "一名小学生",
                "minimum_should_match":"3"  // 或 "minimum_should_match":"60%"
            }
        }
    }
}

3.12 使用id集合查询

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query": {
        "ids":{
            "type":"_doc",
            "values":["1","3"]
        }
    }
}

3.13 match的多字段查询

当字段名称写为 "name^10"时,意思是将 name 字段的权重提升10倍,则命中name的文档分数会高,排序会靠前。

POST http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
    "query":{
        "multi_match":{
            "query":"一名小学生 僵尸",
            "fields":[
                    "desc",
                    "name"   // "name^10"
                ]
        }
    }
}

4. 综述

今天简单聊了一下 Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,希望可以对大家的工作有所帮助。

欢迎大家帮忙点赞、评论、加关注 :)

关注追风人聊Java,每天更新Java干货。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124680