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 ...
随机推荐
- WeChat-SmallProgram:组件 scroll-view 横向和纵向 案例
scroll-view为滚动视图,分为水平滚动和垂直滚动.注意滚动视图垂直滚动时一定要设置高度否则的话scroll-view不会生效. 滚动视图常用的地方一般都是Item项比较多的界面,比如我的模块 ...
- Python python 五种数据类型--字典
# 定义一个字典 var1 = {'a':20,'b':40}; var2 = dict(); print(type(var1)) print(type(var2)) # 长度 length = le ...
- Ubuntu系统在Anaconda中安装Python3.6的虚拟环境
原因:Anaconda的python版本是3.7的,TensorFlow尚不支持此版本,于是我们创建一个Python的虚拟环境以支持TensorFlow 创建tf环境 conda create --n ...
- LayUI制作日历工作记录簿
标题不知道该如何取,大概就是用Lay UI的Table,制作一个日历,在日历上可以添加每天的工作简记录.记录下LayUI Table的一些用法,一些值得探索的地方在于日历生成后,给周末加背景色,当天加 ...
- php 安装教程
php 安装教程 本文采用php7.0.1作为样例,进行安装. 系统环境: CentOS6.7. gcc 4.8.2 libzip 1.0.1 在安装之前,可以先更新CentOS系统. yum -y ...
- 马哥教育PYTHON相关基础 笔记
1 python 推荐书籍 <python Cookbook> <learn python the hard way> <google's python class> ...
- WPF使用 Gmap.NET 绘制极坐标运动轨迹
大家好,已经很久没有更新了,今天写一篇关于WPF 使用 Gmap.NET 相关的,网上很多Winform的很**,所以我给Wpf进行一些补充.虽然它已经很久没有更新了,但是也只能用这个了.没别的好选择 ...
- 适用于小白的 python 快速入门教程
文章更新于:2020-02-17 按照惯例,需要的文件附上链接放在文首 文件名:python-3.7.6-amd64.exe 文件大小:25.6 M 下载链接:https://www.lanzous. ...
- MTK Android Git提取出两个版本之间的差异文件并打包
git提取出两个版本之间的差异文件并打包 首先你得知道版本之间的commit id git log –pretty=oneline $ git log --pretty=oneline 1 差异文件并 ...
- (js描述的)数据结构[链表](4)
(js描述的)数据结构 [链表](4) 一.基本结构 二.想比于数组,链表的一些优点 1.内存空间不是必须连续的,可以充分利用计算机的内存,事项灵活的内存动态管理. 2.链表不必再创建时就确定大小,并 ...