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 ...
随机推荐
- Python python 函数参数:关键字参数
# 关键字参数 '''关键字参数代表传入任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict ''' def student(name,sex,**keywords): print(' ...
- 模块 序列化 json pickle shelv xml
序列化 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传输到远程,因为硬盘或网络传输时只能接受bytes. json 模块 json.dump(d,f) json.load(f ...
- Python input和print函数
一.input函数 可以看出,input()函数默认输入的是字符串类型,需要eval()函数将其进行转换. 区别直接赋值的情况,Python可以自动识别数据类型 二.print函数 1.直接输出 无论 ...
- Redis对象——哈希(Hash)
哈希在很多编程语言中都有着很广泛的应用,而在Redis中也是如此,在redis中,哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},...{f ...
- 【cs224w】Lecture 6 - 消息传递 及 节点分类
目录 Node Classification Probabilistic Relational Classifier Iterative Classification Belief Propagati ...
- Asp.Net.Core WebApi 版本控制
前言 在后端Api的开发过程中,无法避免的会遇到接口迭代的过程,如何保证新老接口的共存和接口的向前的兼容呢,这时候就需要对Api进行版本的控制,那如何优雅的控制Api的版本呢? 开始 Microsof ...
- 从零开始,做一个简单的Vuetify项目,图标安装成功
安装Vuefity的时候,碰到一些坑,经过一番折腾,终于成功,记录正确的姿势如下: 创建一个Vue项目: vue init webpack-simple vular-admin 进入项目目录: cd ...
- Pyhton基本图形绘制
目前学习Python中,记录一些内容~ 以下为部分练习内容 1.Python蟒蛇绘制 1 #PythonDraw.py 2 import turtle as t #t作为turtle的别名:另一种方法 ...
- 1062 Talent and Virtue (25分)(水)
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- C#与html实现WebSocket交互(制作ktv手机点歌)
------------恢复内容开始------------ C#与html实现WebSocket交互(制作ktv手机点歌) C#端代码 static void Main(string[] args) ...