上篇提过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. Python python 函数参数:关键字参数

    # 关键字参数 '''关键字参数代表传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict ''' def student(name,sex,**keywords): print(' ...

  2. 模块 序列化 json pickle shelv xml

    序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. json 模块 json.dump(d,f) json.load(f ...

  3. Python input和print函数

    一.input函数 可以看出,input()函数默认输入的是字符串类型,需要eval()函数将其进行转换. 区别直接赋值的情况,Python可以自动识别数据类型 二.print函数 1.直接输出 无论 ...

  4. Redis对象——哈希(Hash)

    哈希在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},...{f ...

  5. 【cs224w】Lecture 6 - 消息传递 及 节点分类

    目录 Node Classification Probabilistic Relational Classifier Iterative Classification Belief Propagati ...

  6. Asp.Net.Core WebApi 版本控制

    前言 在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢? 开始 Microsof ...

  7. 从零开始,做一个简单的Vuetify项目,图标安装成功

    安装Vuefity的时候,碰到一些坑,经过一番折腾,终于成功,记录正确的姿势如下: 创建一个Vue项目: vue init webpack-simple vular-admin 进入项目目录: cd ...

  8. Pyhton基本图形绘制

    目前学习Python中,记录一些内容~ 以下为部分练习内容 1.Python蟒蛇绘制 1 #PythonDraw.py 2 import turtle as t #t作为turtle的别名:另一种方法 ...

  9. 1062 Talent and Virtue (25分)(水)

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...

  10. C#与html实现WebSocket交互(制作ktv手机点歌)

    ------------恢复内容开始------------ C#与html实现WebSocket交互(制作ktv手机点歌) C#端代码 static void Main(string[] args) ...