上篇提过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模式的更多相关文章

  1. search(7)- elastic4s-search-filter模式

    现在我们可以开始探讨ES的核心环节:搜索search了.search又分filter,query两种模式.filter模式即筛选模式:将符合筛选条件的记录作为结果找出来.query模式则分两个步骤:先 ...

  2. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...

  3. 【起航计划 032】2015 起航计划 Android APIDemo的魔鬼步伐 31 App->Search->Invoke Search 搜索功能 Search Dialog SearchView SearchRecentSuggestions

    Search (搜索)是Android平台的一个核心功能之一,用户可以在手机搜索在线的或是本地的信息.Android平台为所有需要提供搜索或是查询功能的应用提 供了一个统一的Search Framew ...

  4. Comparing randomized search and grid search for hyperparameter estimation

    Comparing randomized search and grid search for hyperparameter estimation Compare randomized search ...

  5. Yii 2.0 query模式语法

    项目使用Yii 2.0版本开发,个人一直喜好使用(new \yii\db\Query())模式操作数据,把增.删.查.改这4种情况的写法整理出来,方便查阅和记忆. 增加 - insert use Yi ...

  6. 【阅读笔记】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 ...

  7. SharePoint Search之(七)Search result- 结果源

    在使用搜索引擎的时候.非常多情况下,用户希望限定一下搜索范围,以便更加easy找到想要的结果. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU1BGYXJ ...

  8. [Math] Beating the binary search algorithm – interpolation search, galloping search

    From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...

  9. 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 ...

随机推荐

  1. -bash: syntax error near unexpected token `newline'问题解决

    原因:bash语法错误,例如, 仔细查看发现语句中不能有'<'和'>',删除这两个符号即可: 问题解决!

  2. Vue 【前端面试题】

    前言 看看面试题,只是为了查漏补缺,看看自己那些方面还不懂.切记不要以为背了面试题,就万事大吉了,最好是理解背后的原理,这样面试的时候才能侃侃而谈.不然,稍微有水平的面试官一看就能看出,是否有真才实学 ...

  3. CentOS7部署指南

    1.rpm包安装---下载安装文件 wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm rpm -ivh jenkins-2 ...

  4. B. Food Buying Round #617(递归 + 模拟)

    B. Food Buying time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. Nginx知多少系列之(二)安装

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

  6. BadMethodCallException : Call to undefined method App\Models\Article::setContainer()

    如果你执行 php artisan db:seed 发生如下错误 说是模型中不存在 静态方法 setContainer()方法,那么你应该检查下你的DatabaseSeeder.php 文件 中的 r ...

  7. leetcode【1403. 非递增顺序的最小子序列】(01)

    题目描述: 给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和. 如果存在多个解决方案,只需返回 长度最小 的子序列.如果仍然有多个解决方 ...

  8. 《民国奇探》的弹幕有点逗比,用 Python 爬下来看看

    电视剧<民国奇探>是一部充斥着逗比风的探案剧,剧中主要角色:三土.四爷.白小姐,三土这个角色类似于<名侦探柯南>中的柯南但带有搞笑属性,四爷则类似于毛利小五郎但有大哥范且武功高 ...

  9. Vue项目添加动态浏览器头部title

    0. 直接上 预览链接 + 效果图 Vue项目添加动态浏览器头部title 1. 实现思路 ( 1 ) 从路由router里面得到组件的title ( 2 ) title存vuex (本项目已经封装h ...

  10. python3(二十四) subClas

    """ 继承的多态 """ __author__ = 'shaozhiqi' # -----------------父类---------- ...