elasticsearch之search template

news/2023/6/8 0:38:28

一、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"}}]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4560728.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

cpu的频率可以反映计算机系统的运行速度,cpu运行速度是多少

cpu运行速度是多少CPU频率,就是CPU的时钟频率,简单说是CPU运算时的工作的频率(1秒内发生的同步脉冲数)的简称。CPU频率,就是决定CPU的运行速度,下面是小编带来的关于cpu运行速度多少的内容,欢迎阅读!cpu运行速度是多少…

超干货!不同系统查看CPU速度的具体步骤这里全都有!

CPU速度决定了进程执行任务的速度。由于多核处理器的出现,CPU速度比过去更快。尽管如此,在购买新程序时检查CPU速度可能很有用,以确保你的计算机能够处理它。知道如何在超频时检查CPU的真实速度以获得更好的性能,这也非常有用。 …

前端js实现多次添加累加文件上传和选择删除(django+js)- 编辑回显文件并上传 (二)

前言 后端返回的是文件地址,并不是文件流或base64编码字符串,而修改数据的接口又只接受文件。 本篇文章主要是基于累加文件上传介绍的。 添加上传文件文章链接:https://blog.csdn.net/qq_43030934/article/details/128726549?spm1001.2014.…

提高计算机CPU运行速度,一招提升电脑CPU40%的性能!解决CPU经常100%的问题

CPU处理器也称为中央处理器,其相当于计算机的心脏,是电脑中的核心配件,也是密不可分的一个组成部分。主要用作于计算机系统的运算和控制核心,也是信息处理、程序运行的最终执行单元。不过在我们日常使用电脑时,有时候也…

提高计算机CPU运行速度,提高cpu运行速度的方法

如何减少电脑cpu占用率,提高运行速度,电脑CPU占用过高,直接影响着电脑的运行的速度,这是大家在使用电脑过程中都普遍关注的问题,下面是学习啦小编收集整理的提高cpu运行速度的方法,希望对大家有帮助~~提高cpu运行速度的方法拆开电脑机箱查看主板上面是否有多余的内存…

Three.js粒子特效,shader渲染初探

这大概是个序 关于Three.js,网上有不多不少的零碎教程,有些过于初级,有些云里雾里,而Three.js官网上的示例逼格之高又令人望而却步,这些对于没学过计算机图形学的童鞋来说,就像入门迈槛不知先迈左脚还是右脚…

unity Shader Lab(cg hlsl glsl)着色器入门教程 以及 vs2019 支持unity shader语法(更新中2019.9.5)

前言: 如果你对cg glsl hlsl 顶点着色器 片段着色器 表面着色器 固定渲染管线 等等有所疑惑,或是想学会unity的渲染,看这一篇就足够了。另外我博客的shader分类中还有很多shader教程和源码,每篇源码都有实现思路、语法功能注释&a…

常见的http面试问题

原文:硬核!30 张图解 HTTP 常见的面试题,给你整明白_小林coding-CSDN博客 原文的作者好几个系列的写的特别好,墙裂推荐。 文章目录前言正文01 HTTP 基本概念02 GET 与 POST03 HTTP 特性04 HTTP 与 HTTPS05 HTTP/1.1、HTTP/2、HTT…