Search APIs简介
- query: 在请求消息体中的query允许我们用Query DSL的方式查询。
- term: 查询时判断某个document是否包含某个具体的值,不会对被查询的值进行分词查询
- match: 将被查询值进行分词,然后用评分机制(TF/IDF)进行打分
- match_phrase: 查询指定段落
- Bool: 结合其他真值查询,通常和must、should、mustnot(与或非)一起组合出复杂的查询
- range: 查询时指定某个字段在某个特定的范围 (gte:>=;gt:>;lte:<=;le:<)
- from: 以一定的偏移量来查看我们检索的结果,缺省从检索的第一条数据开始显示
- size: 指定检索结果中输出的数据条数,缺省为10条
- sort: 允许我们将检索的结果以指定的字段进行排序显示
- _source: 指定检索结果输出的字段
- script_fields: 该类型允许我们通过一个脚本来计算document中不存在的值,比如我们需要计算install/click得到cti之类的
- aggs: 基于搜索查询,可以嵌套聚合来组合复杂的需求
返回数据含义
- took:表示该操作的耗时(单位为毫秒)
- timed_out:表示是否超时
- hits:表示命中的记录
- total:返回记录数,本例是2条。
- max_score:最高的匹配程度,本例是1.0。
- hits:返回的记录组成的数组。
- _score:表示匹配的程序,默认是按照这个字段降序排列。
text字段和keyword字段的区别
字段被设置成 keyword 类型,录入数据该字段是不会被分词,所以使用term查询时候,需要全匹配才能查询到。
text,会将字段进行分词,如“hello world”会被分词为["hello","world",...],而term必须匹配到数组中的一项,才能查出结果。
match,match_phrase和term区别
elastic会对查询语句进行分词
term
term 查询语句不分词
term查询keyword字段
keyword字段不分词
term查询keyword字段,需要完全匹配
term查询text字段
text字段分词
term查询text字段,必须为text字段分词后中的某一个才行。如“我真帅”分词为["我","真","帅"],term必须为“我”或“真”或“帅”,才能查到,而“我帅”、“真帅”不行。
match
match 查询语句分词
match查询keyword字段
keyword字段不分词
match查询keyword字段,需要完全匹配
match查询text字段
text字段分词
match查询text字段,只需要match分词结果中和text分词有匹配就可以查出。如“我真帅”分词为["我","真","帅"],match的查询语句“真帅”被分词为["真","帅"],其中“真”、“帅”能匹配上text字段的分词结果,所以能查出。
match_phrase
match_phrase 查询语句分词
match_phrase 查询keyword字段
keyword字段不分词
match_phrase 查询keyword字段,需要完全匹配
match_phrase 查询text字段
text字段分词
match_phrase 查询text字段,只需要match_phrase 分词结果中和text分词有匹配且查询语句必须包含在text分词结果中,同时顺序相同且连续,才可以查出。如“我真帅”分词为["我","真","帅",“真帅”],match_phrase 的查询语句“真帅”被分词为["真帅"],其中“真帅”能匹配上text字段的分词结果,连续且顺序相同,所以能查出。
ES与RDBMS数据库比较
简单对比
RDBMS | Elasticsearch | 备注 |
---|---|---|
Database(数据库) | Index(索引) | |
Table(表) | Type(类型) | ES6.x后一个index对应一个type |
Row(行) | Docment(文档) | es保存json |
Column(列) | Field(字段) | |
Schema(约束) | Mapping(映射) | 只能说类似,不完全一样 |
Index(所以) | Everything is indexed(万物皆为索引) | es中存储数据都是索引 |
SQL(结构化查询语言) | DSL(ES独特的查询语言) |
QueryBuilder 同时使用 should must
QueryBuilder query = QueryBuilders.boolQuery()
.should(QueryBuilders.boolQuery()
.filter(QueryBuilders.matchPhraseQuery("tablenamecn","*"+keyWords1 +"*")))
.should(QueryBuilders.boolQuery()
.filter(QueryBuilders.wildcardQuery("tablename","*"+keyWords1 +"*")));
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("disabled", 0))
.must(QueryBuilders.matchQuery("tablestatus", 0))
.must(QueryBuilders.matchQuery("type", TABLE_TYPE))
.must(query);
bool 过滤
must :must子句(查询)必须出现在匹配的文档中,并有助于得分,类似于 and。
filter : filter子句(查询)必须出现在匹配的文档中。但是不同于 must查询的分数将被忽略(必须匹配,运行在非评分&过滤模式)。
must_not :不包含条件查询的数据,类似于 not,
should:至少有一个查询条件匹配, 类似于 or。
1.例入我们查询一个where field1 = xx and field2 in (xx,xxx,xxxx);
{
"query":{
"bool": {
"must":[
{"terms": {"field2":["xx","xxx","xxxx"]}},
{"term" : {"field1":"xx "}}
]
}
}
}
2.例入我们查询一个where field1 = xx and field2 =xx or field3 =xx and field4 !=xx;
{
"query":{
"bool": {
"must":[
{"term" : {"field1":"xx"}},
{"term" : {"field2":"xx"}}
],
"should":{"term" : {"field3":"xx"}},
"must_not":{"term" : {"field4":"xx"}}
}
}
}
{
"query": {
"bool": {
"must": [
{"term": {"a": "1"}},
{"term":{"b": "2"}}
{
"bool": {
"should": [
{"term": {"c": "1"}},
{"term": {"d": "2"}}
]
}
}
]
}
},
"sort": {
"time": {
"order": "desc"
}
},
"size": 100
}
4)范围条件查询
gt: > 大于
lt: < 小于
gte: >= 大于或等于
lte: <= 小于或等于
range查询,它允许我们通过一定范围的值来过滤文档。这通常用于数字或日期过滤。例:
①.{ "query":{ "bool": { "filter": { "range":{ "stu_age":{ "gte":20, "lte":22 } } } } }}
5)wildcards :通配符查询,类似模糊查询。
{ "query": { "wildcard": { "field": "*xx*" } }}
(注:两边加*则匹配添加前后的所有符合的结果,可以使用正则匹配)
6)sort : 排序(sort":{"field ":{"order":"desc"}})
{ "query": { "match_all": {} }, "sort": { "field": { "order": "desc" } }}
7)_source :搜索指定的字段 ("_source":["field1","field2"])
{ "query": { "match_all": {} }, "_source": ["field1", "field2"]}
from : 查询开始参数,from默认为0.
size : 查询条数;size未指定默认为10.
{ "query": { "match_all": {} }, "from": 0, "size": 10}