elasticsearch之search template
一、search template简介
elasticsearch提供了search template功能,其会在实际执行查询之前,对search template进行预处理并将参数填充到template中。
elasticsearch主要提供了两个API来支持search template
_scripts/用于对search template的维护;
_search/template使用search template进行搜索;
二、测试数据准备
批量index三个文档
POST _bulk
{ "index" : { "_index" : "search_template_test", "_type" : "_doc", "_id" : "1" } }
{ "name":"zhang san",	"age":30,	"man":true,	"address":"Hebei LangFang"}
{ "index" : { "_index" : "search_template_test", "_type" : "_doc", "_id" : "2" } }
{ "name":"li si",	"age":20,	"man":true,	"address":"BeiJing HaiDian"}
{ "index" : { "_index" : "search_template_test", "_type" : "_doc", "_id" : "3" } }
{ "name":"liu hui",	"age":40,	"man":false,	"address":"NeiMengGu ChiFeng"}
查询查看三个索引的文档
GET search_template_test/_search
{
    "took":6,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":3,
        "max_score":1,
        "hits":[
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"2",
                "_score":1,
                "_source":{
                    "name":"li si",
                    "age":20,
                    "man":true,
                    "address":"BeiJing HaiDian"
                }
            },
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"1",
                "_score":1,
                "_source":{
                    "name":"zhang san",
                    "age":30,
                    "man":true,
                    "address":"Hebei LangFang"
                }
            },
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"3",
                "_score":1,
                "_source":{
                    "name":"liu hui",
                    "age":40,
                    "man":false,
                    "address":"NeiMengGu ChiFeng"
                }
            }
        ]
    }
}
三、维护search template
我们新建id为search_template_test.match_name的search template,其主要是查询match 字段name;
POST _scripts/search_template_test.match_name
{
    "script": {
        "lang": "mustache",
        "source": {
            "query": {
                "match": {
                    "name": "{{name_val}}"
                }
            }
        }
    }
}
查看我们创建的search template
GET _scripts/search_template_test.match_name
{
    "_id":"search_template_test.match_name",
    "found":true,
    "script":{
        "lang":"mustache",
        "source":"{\"query\":{\"match\":{\"name\":\"{{name_val}}\"}}}",
        "options":{
            "content_type":"application/json; charset=UTF-8"
        }
    }
}
删除我们创建的search template
DELET _scripts/search_template_test.match_name
{
    "acknowledged":true
}
elasticsearch提供了API支持我们查看预处理最终形成的查询语句;
POST _render/template/search_template_test.match_name
{
    "params":{
        "name_val":"zhang li"
    }
}
{
    "template_output":{
        "query":{
            "match":{
                "name":"zhang li"
            }
        }
    }
}
四、使用search template
我们可以像下边这样使用search template
POST search_template_test/_search/template
{
    "id": "search_template_test.match_name",
    "params": {
        "name_val":"zhang li"
    }
}
{
    "took":1,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":2,
        "max_score":0.2876821,
        "hits":[
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"2",
                "_score":0.2876821,
                "_source":{
                    "name":"li si",
                    "age":20,
                    "man":true,
                    "address":"BeiJing HaiDian"
                }
            },
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"1",
                "_score":0.2876821,
                "_source":{
                    "name":"zhang san",
                    "age":30,
                    "man":true,
                    "address":"Hebei LangFang"
                }
            }
        ]
    }
}
执行search template也支持使用explain来调试查看elasticsearch的打分情况;
POST search_template_test/_search/template
{
    "id": "search_template_test.match_name",
    "params": {
        "name_val":"zhang li"
    },
    "explain":true
}
{
    "took":3,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":2,
        "max_score":0.2876821,
        "hits":[
            {
                "_shard":"[search_template_test][2]",
                "_node":"Sl6S4Kn2Rh-BdNgaM3ZwJg",
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"2",
                "_score":0.2876821,
                "_source":{
                    "name":"li si",
                    "age":20,
                    "man":true,
                    "address":"BeiJing HaiDian"
                },
                "_explanation":{
                    "value":0.2876821,
                    "description":"sum of:",
                    "details":[
                        {
                            "value":0.2876821,
                            "description":"weight(name:li in 0) [PerFieldSimilarity], result of:",
                            "details":[
                                ......
                            ]
                        }
                    ]
                }
            },
            {
                "_shard":"[search_template_test][3]",
                "_node":"Sl6S4Kn2Rh-BdNgaM3ZwJg",
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"1",
                "_score":0.2876821,
                "_source":{
                    "name":"zhang san",
                    "age":30,
                    "man":true,
                    "address":"Hebei LangFang"
                },
                "_explanation":{
                    "value":0.2876821,
                    "description":"sum of:",
                    "details":[
                        {
                            "value":0.2876821,
                            "description":"weight(name:zhang in 0) [PerFieldSimilarity], result of:",
                            "details":[
                                ......
                            ]
                        }
                    ]
                }
            }
        ]
    }
}
执行search template也支持使用profile来调试查看elasticsearch的查询执行情况;
POST search_template_test/_search/template
{
    "id": "search_template_test.match_name",
    "params": {
        "name_val":"zhang li"
    },
    "profile":true
}
{
    "took":11,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":2,
        "max_score":0.2876821,
        "hits":[
        ]
    },
    "profile":{
        "shards":[
            {
                "id":"[Sl6S4Kn2Rh-BdNgaM3ZwJg][search_template_test][0]",
                "searches":[
                    {
                        "query":[
                            {
                                "type":"BooleanQuery",
                                "description":"name:zhang name:li",
                                "time_in_nanos":308301,
                                "breakdown":{
                                    "score":0,
                                    "build_scorer_count":0,
                                    "match_count":0,
                                    "create_weight":308300,
                                    "next_doc":0,
                                    "match":0,
                                    "create_weight_count":1,
                                    "next_doc_count":0,
                                    "score_count":0,
                                    "build_scorer":0,
                                    "advance":0,
                                    "advance_count":0
                                },
                                "children":[
                                    {
                                        "type":"TermQuery",
                                        "description":"name:zhang",
                                        "time_in_nanos":32901,
                                        "breakdown":{
                                            "score":0,
                                            "build_scorer_count":0,
                                            "match_count":0,
                                            "create_weight":32900,
                                            "next_doc":0,
                                            "match":0,
                                            "create_weight_count":1,
                                            "next_doc_count":0,
                                            "score_count":0,
                                            "build_scorer":0,
                                            "advance":0,
                                            "advance_count":0
                                        }
                                    },
                                    {
                                        "type":"TermQuery",
                                        "description":"name:li",
                                        "time_in_nanos":15901,
                                        "breakdown":{
                                            "score":0,
                                            "build_scorer_count":0,
                                            "match_count":0,
                                            "create_weight":15900,
                                            "next_doc":0,
                                            "match":0,
                                            "create_weight_count":1,
                                            "next_doc_count":0,
                                            "score_count":0,
                                            "build_scorer":0,
                                            "advance":0,
                                            "advance_count":0
                                        }
                                    }
                                ]
                            }
                        ],
                        "rewrite_time":42700,
                        "collector":[
                            {
                                "name":"CancellableCollector",
                                "reason":"search_cancelled",
                                "time_in_nanos":700,
                                "children":[
                                    {
                                        "name":"SimpleTopScoreDocCollector",
                                        "reason":"search_top_hits",
                                        "time_in_nanos":200
                                    }
                                ]
                            }
                        ]
                    }
                ],
                "aggregations":[
                ]
            }
        ]
    }
}
五、使用search template处理复杂的查询
我们构建以下search template,其功能如下
可以通过name字段进行match,如果命中字段中的各个关键字相邻则有更高的权重打分,同时可以通过address字段进行模糊匹配,这三个查询只要命中一个即可;
man字段值必须符合输入的值;
POST _scripts/search_template_test.multi_search_template
{
    "script":{
        "lang":"mustache",
        "source":{
            "query":{
                "bool":{
                    "should":[
                        {
                            "match":{
                                "name":"{{name}}"
                            }
                        },
                        {
                            "match_phrase_prefix":{
                                "name":"{{name}}"
                            }
                        },
                        {
                            "query_string":{
                                "default_field":"address",
                                "query":"{{#join delimiter=' '}}address{{/join delimiter=' '}}"
                            }
                        }
                    ],
                    "filter":{
                        "term":{
                            "man":"{{man}}"
                        }
                    },
                    "minimum_should_match":1
                }
            }
        }
    }
}
通过以下参数命中前两条数据
POST search_template_test/_search/template
{
    "id":"search_template_test.multi_search_template",
    "params":{
        "name":"zhang sa",
        "address":[
            "*bei*",
            "*chi*"
        ],
        "man":true
    }
}
{
    "took":10,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":2,
        "max_score":1.8630463,
        "hits":[
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"1",
                "_score":1.8630463,
                "_source":{
                    "name":"zhang san",
                    "age":30,
                    "man":true,
                    "address":"Hebei LangFang"
                }
            },
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"2",
                "_score":1,
                "_source":{
                    "name":"li si",
                    "age":20,
                    "man":true,
                    "address":"BeiJing HaiDian"
                }
            }
        ]
    }
}
我们将man字段设置为false,从而只匹配第三条记录;
POST search_template_test/_search/template
{
    "id":"search_template_test.multi_search_template",
    "params":{
        "name":"zhang sa",
        "address":[
            "*bei*",
            "*chi*"
        ],
        "man":false
    }
}
{
    "took":4,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":1,
        "max_score":1,
        "hits":[
            {
                "_index":"search_template_test",
                "_type":"_doc",
                "_id":"3",
                "_score":1,
                "_source":{
                    "name":"liu hui",
                    "age":40,
                    "man":false,
                    "address":"NeiMengGu ChiFeng"
                }
            }
        ]
    }
}
												
											elasticsearch之search template的更多相关文章
- Elasticsearch:search template
		
我们发现一些用户经常编写了一些非常冗长和复杂的查询 - 在很多情况下,相同的查询会一遍又一遍地执行,但是会有一些不同的值作为参数来查询.在这种情况下,我们觉得使用一个search template(搜 ...
 - elasticsearch.net search入门使用指南中文版(翻译)
		
elasticsearch.net search入门使用指南中文版,elasticsearch.Net是一个非常底层且灵活的客户端,它不在意你如何的构建自己的请求和响应.它非常抽象,因此所有的elas ...
 - elasticsearch.net search入门使用指南中文版
		
原文:http://edu.dmeiyang.com/book/nestusing.html elasticsearch.net为什么会有两个客户端? Elasticsearch.Net是一个非常底层 ...
 - Elasticsearch URI search 查询语法整理
		
Elasticsearch URI search 一.请求体查询与空查询 1. 请求体查询(request body search) 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如 ...
 - 可以执行全文搜索的原因 Elasticsearch full-text search  Kibana  RESTful API with JSON over HTTP  elasticsearch_action  es 模糊查询
		
https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...
 - Elasticsearch的Search详解
		
介绍 ES不是新技术,是将全文检索和数据分析.分布式整合到一起. 基于lucene开发,提供简单的restful api接口.java api接口.其他语言开发接口等. 实现了分布式的搜索引擎和分析引 ...
 - elasticsearch 深入 —— Search After实时滚动查询
		
Search After 一般的分页需求我们可以使用form和size的方式实现,但是这种分页方式在深度分页的场景下应该是要避免使用的.深度分页会随着请求的页次增加,所消耗的内存和时间的增长也是成比例 ...
 - Beats:为 Beats => Logstash => Elasticsearch 架构创建 template 及 Dashboard
		
文章转载自:https://elasticstack.blog.csdn.net/article/details/115341977 前一段时间有一个开发者私信我说自己的 Beats 连接到 Logs ...
 - elasticsearch 深入 —— Search Type检索类型
		
在此我们再给出那个查询的代码: $ curl -XGET localhost:9200/startswith/test/_search?pretty -d '{ "query": ...
 - Elasticsearch:跨集群搜索 Cross-cluster search (CCS)
		
转载自:https://blog.csdn.net/UbuntuTouch/article/details/104588232 跨集群搜索(cross-cluster search)使您可以针对一个或 ...
 
随机推荐
- 齐博x1 直播神器聊天小插件
			
下载地址如下:https://down.php168.com/livemsg.rar 本插件由论坛网友笨熊提供 非常感谢他给大家提供那么一个非常好用的直播必备神器. 如下图所示,大家在直播的时候,这个 ...
 - Java实现7种常见密码算法
			
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...
 - llinux下mysql建库、新建用户、用户授权、修改用户密码
			
1.创建新的数据库 1.1.root用户登录mysql mysql -u root -p 1.2.查看现有数据库 show databases; 1.3.新建数据库,此命名为cjc create ...
 - Python爬虫urllib库的使用
			
urllib 在Python2中,有urllib和urllib2两个库实现请求发送,在Python3中,统一为urllib,是Python内置的HTTP请求库 request:最基本的HTTP请求模块 ...
 - springcloud组件梳理之hystrix
			
在微服务架构体系中,各服务中间的相互调用是常态,没有哪个服务能保证自身百分百不会出问题,然后再加上网络的波动以及环境等问题,服务间调用的稳定性无法保证,这时候就需要一个有容错能力的组件来介入,当调用出 ...
 - 2022ICPC区域赛参后感悟
			
第一次参加正式的大类赛事,在某种程度上挺激动的.我呢,可以说是刚步入竞赛一年,在此期间遇见了一些志同道合的朋友,最重要的是遇见了我的队友. 开始前,我幻想过我们小队可以超常发挥,拿取学校中第一个区域赛 ...
 - 造个Python轮子,实现根据Excel生成Model和数据导入脚本
			
前言 最近遇到一个需求,有几十个Excel,每个的字段都不一样,然后都差不多是第一行是表头,后面几千上万的数据,需要把这些Excel中的数据全都加入某个已经上线的Django项目 这就需要每个Exce ...
 - 面试 考察js基础不能不会的内容(第五天)
			
01.描述事件冒泡的流程 基于 DOM 树结构,事件会顺着触发元素向上冒泡 点击一个div,会一级一级向父级.爷级元素上冒泡,这个点击事件不仅能被这个div捕捉到,也能被他的父级.爷爷级-元素捕捉到 ...
 - bugku 备份是个好习惯
			
打开是一段神秘代码,我也不知道是什么 直接解密试试 尝试各种,发现是md5,解开是.... 可能需要我们传什么东西进去,抓包看看,无果.... 看看题目是备份,可能这道题就和备份文件有关 我就直接点了 ...
 - 树莓派编译opencv4
			
前言 我用的是 树莓派3b 编译的 opencv4.1.0,如果不想编译可以直接下载我编译好的. 下载地址 直接 make install,或者按照我后续步骤复制动态链接库. 准备 需要调节虚拟内存大 ...