ES常用查询2
1、子条件查询:特定字段查询所指特定值
Query context
在查询中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配程度。
旨在判断目标文档和查询条件匹配的有多好。
常用查询:
(1)、全文本查询:针对文本类型数据
#模糊匹配1
POST 127.0.0.1:9200/book/_search
{
"query":{
"match":{
"author":"wxk"
}
}
}
#模糊匹配2,查询结果显示 ES 和 入门相关的结果
{
"query":{
"match":{ #关键字
"title":"ElasticSearch学习"
}
}
}
结果:只要title 里有 ElasticSearch 或 学习 的都会被搜出来
#phrase 匹配,精确匹配,但是匹配项目是结果的子集
{
"query":{
"match_phrase":{ #关键字
"title":"ElasticSearch入门"
}
}
}
#多字段查询模糊匹配查询,author和title 包含 wxk
{
"query":{
"multi_match":{ #关键字
"query":"wxk",
"fields":["author","title"]
}
}
}
#多条件查询在bool查询中记录
#语法查询
#或语句,全文、模糊搜索
{
"query":{
"query_string":{ #关键字
"query":"(ElasticSearch AND 大法) OR Python"
}
}
}
#语法查询,查多个字段
{
"query":{
"query_string":{ #关键字
"query":"wxk OR ElasticSearch",
"fields":["title","author"]
}
}
}
#多字段的模糊匹配,可以用 AND 达到目标
{
"query":{
"query_string":{ #关键字
"query":"wxk AND ElasticSearch",
"fields":["title","author"]
}
}
}
(2)字段级别查询:针对结构化数据,如数字、日期
#结构化查询,查询数字,日期等
{
"query":{
"term":{ #关键字
"word_count":1000
}
}
}
#结构化查询,查询文本
{
"query":{
"term":{ #关键字
"author":"qsy"
}
}
}
#结构化查询,范围查询数字
{
"query":{
"range":{ #关键字
"word_count":{
"gte":1000,
"lte":2000
}
}
}
}
#结构化查询,范围查询日期
{
"query":{
"range":{ #关键字
"publish_date":{
"gte":"1990-01-01",
"lte":"1990-3-31" # 也可以用 now 关键词
}
}
}
}
2、Filter context
在查询过程中,只判断该文档是否满足条件,只有Yes或者No
filter 一般做过滤,es会对结果进行缓存,相对query会更快,但是要引入bool
#filter 查询
POST 127.0.0.1:9200/book/_search
{
"query":{
"bool":{
"filter":{
"term":{
"word_count":1000
}
}
}
}
}
3、复合条件查询:以一定的逻辑组合子条件查询
固定分数查询
#普通查询:
POST 127.0.0.1:9200/_search
{
"query":{
"match":{
"title":"ElasticSearch"
}
}
}
结果会出现评分,_score
#进行固定分数查询:固定分数查询不支持match,只支持filter
POST 127.0.0.1:9200/_search
{
"query":{
"constant_score":{
"filter":{
"match":{
"title":"ElasticSearch"
}
},
# "boost":2 这里设置 score 为 2
}
}
}
结果中所有_score 默认都是 1 ,设置boost后为设置的值
#布尔查询 匹配是 或 的关系
{
"query":{
"bool":{
"should": [
{"match":{"author":"qsy"}},
{"match":{"title":"ElasticSearch"}}
]
}
}
}
结果为或
#布尔查询 匹配是 与 的关系
{
"query":{
"bool":{
"must":[
{
"match":{
"author":"qsy"
}
},
{
"match":{
"title":"ElasticSearch"
}
}
]
}
}
}
结果为与
注意:这里 should 匹配的话是模糊匹配,但是 must 的话是精确匹配,例如搜索title的内容,只会去精确匹配 ElasticSearch
#思考,如何多条件模糊匹配呢?
#多字段的模糊匹配,可以用 AND 达到目标
{
"query":{
"query_string":{ #关键字
"query":"wxk AND ElasticSearch",
"fields":["title","author"]
}
}
}
#must,should 组合查询
must,must_not,should每个只能出现一次
{
"query": {
"bool": {
"must": { "match": { "title": "python" }},
"must_not": { "match": { "publish_date": "1990-2-19" }},
"should": [
{ "match": { "title": "学习" }},
{ "match": { "author": "qsy" }}
]
}
}
}
#布尔查询 匹配是 must not 的关系
{
"query":{
"bool":{
"must_not":{
"term":{
"author":"wxk"
}
}
}
}
}