search(8)- elastic4s-search-query模式
上篇提过query模式除对记录的筛选之外还对符合条件的记录进行了评分,即与条件的相似匹配程度。我们把评分放在后面的博文中讨论,这篇我们只介绍query查询。
查询可以分为绝对值查询和全文查询:绝对值查询是指非text类型字段的查询,全文查询一般指对于text字段的查询。如果需要对text字段进行绝对值查询的话可以用fields在text字段下定义一个keyword字段。text类型字段在建索引时会经分词器处理分解成许多单词,然后在查询时查询目标也会经历分词处理后才逐个单词进行匹配。所以要注意录入的查询条件不一定是最终的查询内容,因为会首先进行分词处理。
我们先看几个绝对值查询例子:
POST /bank/_search
{
"query" : {
"term" : {
"state.keyword": "IL"
}
}
}
POST /bank/_search
{
"query" : {
"terms" : {
"state.keyword": ["IL","WA"]
}
}
}
POST /bank/_search
{
"query" : {
"range" : {
"age": {
"gte" : ,
"lte" :
}
}
}
} POST /bank/_search
{
"query" : {
"prefix" : {
"address.keyword": ""
}
}
}
POST /bank/_search
{
"query" : {
"wildcard": {
"address.keyword": "*Holmes*"
}
}
}
POST /bank/_search
{
"query" : {
"regexp": {
"address.keyword": ".*Holmes.*"
}
}
}
elastic4s的表达形式如下:
val qTerm = search("bank").query(termQuery("state.keyword","IL"))
val qTerms = search("bank").query(termsQuery("state.keyword","IL","WA"))
val qRange = search("bank").query(rangeQuery("age").gte().lte())
val qPrefix = search("bank").query(prefixQuery("address.keyword",""))
val qWildcard = search("bank").query(wildcardQuery("address.keyword","*Holmes*"))
val qRegex = search("bank").query(regexQuery("address.keyword",".*Holmes.*"))
全文查询最简单的例子就是match query 了:
POST /bank/_search
{
"query" : {
"match" : { "address" : "holmes"}
}
} val qMatch = search("bank").query(matchQuery("address","holmes"))
以上是个单字查询示范。多字全文查询如下:
POST /bank/_search
{
"query" : {
"match" : { "address" : "holmes lane"}
}
} val qMMatch = search("bank").query(matchQuery("address","holmes lane"))
问题出现了:查询结果不但有"880 Holmes Lane"还包括了"685 School Lane",这是因为分词器把"holmes lane" 分解成了"holmes","lane"两个单字,而多字查询默认关系是or,只要包含holmes,lane任何一项都符合条件。我们可以用and关联:
POST /bank/_search
{
"query" : {
"match" : {
"address" : {
"query": "holmes lane",
"operator": "and"
}
}
}
} val qMMatchAnd = search("bank").query(matchQuery("address","holmes lane").operator("and"))
现在结果只剩下"880 Holmes Lane"一条了。下面这个query与之有同效:
POST /bank/_search
{
"query" : {
"match" : {
"address" : {
"query": "holmes lane",
"minimum_should_match": "100%"
}
}
}
} val qMMatchMin = search("bank").query(matchQuery("address","holmes lane").minimumShouldMatch("100%"))
以上例子都是简单类型的查询,即单语句查询。现实中我们普遍需要用and,or来结合多种条件形成复合式查询。最具代表性的也就是boolQuery了。boolQuery的格式如下:
GET /bank/_search
{
"query": {
"bool": {
"must": [ // lastname=duke and gender.keyword = M
{ "match": { "lastname": "duke" }},
{ "term": { "gender.keyword": "M" }}
],
"must_not": [ // and firstname.keyword != Jackson and city.keyword != Jackson
{ "term": { "firstname.keyword": "Jackson"}},
{ "term": { "city.keyword": "Brogan" }}
],
"should": [ // or email.keyword = *.cn or age >= 80
{ "wildcard": { "email.keyword": "*.cn" }},
{ "range": { "age": {"gte" : }}}
],
"filter": [ // filter state.keyword in (IL,WA,TA) and balance >= 100000
{ "terms": { "state.keyword": ["IL","WA","TA"] }},
{ "range": { "balance": { "gte": }}}
]
}
}
}
在elastic4s里这样表示:
val qBool = search("bank").query(
boolQuery().must(
matchQuery("lastname","duke"),
termQuery("gender.keyword","M")
).not(
termQuery("fistname.keyword","Jackson"),
termQuery("city.keyword","Brogan")
).should(
termsQuery("state.keyword",Seq("IL","WA","TA")),
rangeQuery("balance").gte()
)
)
上面例子里的must,must_no,should,filter各段落可以单独或联合形式任意出现在boolQuery里。在任何段落里还可以嵌入boolQuery, 如下:
GET /bank/_search
{
"query": {
"bool": {
"must": [
{ "match": { "lastname": "duke" }},
{ "term": { "gender.keyword": "M" }}
],
"must_not": [
{ "term": { "firstname.keyword": "Jackson"}},
{ "term": { "city.keyword": "Brogan" }}
],
"should": [
{ "wildcard": { "email.keyword": "*.cn" }},
{ "range": { "age": {"gte" : }}}
],
"filter": [
{ "terms": { "state.keyword": ["IL","WA","TA"] }},
{ "range": { "balance": { "gte": }}},
{
"bool" : {
"should" : [
{"range" : {"balance" :{"gte" : }}}
]
}
}
]
}
}
}
search(8)- elastic4s-search-query模式的更多相关文章
- search(7)- elastic4s-search-filter模式
现在我们可以开始探讨ES的核心环节:搜索search了.search又分filter,query两种模式.filter模式即筛选模式:将符合筛选条件的记录作为结果找出来.query模式则分两个步骤:先 ...
- 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)
1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...
- 【起航计划 032】2015 起航计划 Android APIDemo的魔鬼步伐 31 App->Search->Invoke Search 搜索功能 Search Dialog SearchView SearchRecentSuggestions
Search (搜索)是Android平台的一个核心功能之一,用户可以在手机搜索在线的或是本地的信息.Android平台为所有需要提供搜索或是查询功能的应用提 供了一个统一的Search Framew ...
- Comparing randomized search and grid search for hyperparameter estimation
Comparing randomized search and grid search for hyperparameter estimation Compare randomized search ...
- Yii 2.0 query模式语法
项目使用Yii 2.0版本开发,个人一直喜好使用(new \yii\db\Query())模式操作数据,把增.删.查.改这4种情况的写法整理出来,方便查阅和记忆. 增加 - insert use Yi ...
- 【阅读笔记】Ranking Relevance in Yahoo Search (三)—— query rewriting
5. QUERY REWRITING 作用: query rewriting is the task of altering a given query so that it will get bet ...
- SharePoint Search之(七)Search result- 结果源
在使用搜索引擎的时候.非常多情况下,用户希望限定一下搜索范围,以便更加easy找到想要的结果. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU1BGYXJ ...
- [Math] Beating the binary search algorithm – interpolation search, galloping search
From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...
- LeetCode:Search Insert Position,Search for a Range (二分查找,lower_bound,upper_bound)
Search Insert Position Given a sorted array and a target value, return the index if the target is fo ...
随机推荐
- CUDA编程入门
CUDA是一个并行计算框架.用于计算加速.是nvidia家的产品.广泛地应用于现在的深度学习加速. 一句话描述就是:cuda帮助我们把运算从cpu放到gpu上做,gpu多线程同时处理运算,达到加速效果 ...
- sql MariaDB 安装contos
安装和运行MySQL数据库(MariaDB) centos 平台 1.安装和运行 yum install mariadb mariadb-server - 安装 systemctl start mar ...
- Python——NumPy库入门
1.数据的纬度 维度:一组数据的组织形式 1.1 一维数据 一维数据由对等关系的有序或无序数据构成,采用线性方式组织 ,对应列表.数组和集合等概念 列表:数据类型可以不同 ,如 3.1413, 'pi ...
- SpringCloud入门(八): Zuul 过滤器详解
Zuul 过滤器 zuul 有四种过滤器类型,分别是: 1.Pre:过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等: 2.Routing:过滤器 ...
- Android 数据库框架 DBFlow 的使用
原文首发于微信公众号:jzman-blog,欢迎关注交流! DBFlow 是一个基于注解处理器开发的使用方便的 ORM Android 数据库,该库简化了很多多余的代码,并且提供了好用的 API 来处 ...
- 从零开始,做一个简单的Vuetify项目,图标安装成功
安装Vuefity的时候,碰到一些坑,经过一番折腾,终于成功,记录正确的姿势如下: 创建一个Vue项目: vue init webpack-simple vular-admin 进入项目目录: cd ...
- IO 模型知多少
1. 引言 同步异步I/O,阻塞非阻塞I/O是程序员老生常谈的话题了,也是自己一直以来懵懵懂懂的一个话题.比如:何为同步异步?何为阻塞与非阻塞?二者的区别在哪里?阻塞在何处?为什么会有多种IO模型,分 ...
- CVPR2018关键字分析生成词云图与查找
今日目标:爬取CVPR2018论文,进行分析总结出提到最多的关键字,生成wordCloud词云图展示,并且设置点击后出现对应的论文以及链接 对任务进行分解: ①爬取CVPR2018的标题,简介,关键字 ...
- 合理使用CSS框架,加速UI设计进程
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/how-to-speed-up-your-d ...
- matplotlib中的基本概念
有外语基础的朋友看这里: matplotlib官方文档 Figure(图像): 组成部分