Elasticsearch(六)——Query

查询案例的测试数据

POST /blog/paper/_bulk
{"index":{"_id":1}}
{"pID":"7ec0e0e5-a4b0-46d7-af56-5b3eab477aea","uID":1,"publish":false,"date":"2018-01-02","title":"this is java and elasticsearch blog"}
{"index":{"_id":2}}
{"pID":"69590fe7-3be0-4d82-94b6-ecdb661ced34","uID":2,"publish":true,"date":"2018-10-11","title":"this is java blog"}
{"index":{"_id":3}}
{"pID":"aec30fa2-10b9-4774-9569-f8d32a80267f","uID":1,"publish":false,"date":"2018-06-25","title":"this is elasticsearch blog"}
{"index":{"_id":4}}
{"pID":"a8733527-6bca-4768-ba60-253afc3d0329","uID":3,"publish":false,"date":"2017-01-16","title":"this is java,elasticsearch hadoop blog"}

操作简单,方便通过命令行测试,仅包含部分查询语法。常用的参数如下:

字段 描述
-q 指定查询的语句,语法Query String Syntax
-df q 中不指定字段时默认查询字段
-sort 排序
-timeout 指定超时时间,默认不超时
-from,size 用于分页
GET /_index/_search?q=tom&df=user&sort=age:asc&from=4&size=10&timeout=1s

上面的语句意思查询userz字段包含tom的文档,结果按照age升序排列,返回第5-14个文档,如果超过1s没有结束,则超时结束
泛查询
等效于在所在字段去匹配改term

URI Search

指定字段查询

+代表必须包含-(减号)代表不包含

GET blog/paper/_search?q=title:elasticsearch
GET blog/paper/_search?q=+title:elasticsearch
GET blog/paper/_search?q=-title:elasticsearch
字段 描述
took 耗费了几毫秒
timed_out 是否超时,这里是false,代表没超时
_shards 数据拆成了几个分片,这里是5个,所以对于搜索请求,会打到所有的primary shard(或者是他的某个replica shard也可以)
hits.total 查询结果的数量,3个document
hits.max_score score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数越高。
hits.hits 包含了匹配搜索的document的详细数据

full text(全文检索)

针对text类型的字段进行全文搜索,会对查询语句先进行分词处理,match,match_phrase等query类型

match query

es会在底层自动将math query转换成bool should语法

GET blog/paper/_search
{
  "query": {
    "match": {
      "title": "java elasticsearch"
    }
  }
}

operator关键字

operator 控制精准度,and 表示希望分词都匹配,转换成bool must语法

GET blog/paper/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch",
        "operator": "and"
      }
    }
  }
}

minimum_should_match关键字

GET blog/paper/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch hadoop spark",
        "minimum_should_match": "75%"
      }
    }
  }
}

习惯性算分

习惯性算分是指文档与查询语句间的相关度,本质是一个排序问题,排序的依据是习惯性算分。
相关系算分的重要概念

算法 说明
Term Frequery(tf) 词频,单词在该文档出现的次数,词频越高,相关度越高
Document Frequery(df) 词频,单词在该文档出现的次数,词频越高,相关度越高
Inverse Document Frequery(IDF) 逆向文档频率,单词出现的文档数越少,相关度越高
Filed-lenght Frequery(df) 文档越短,习惯性越高

es目前主要的两个相关性算分模型
TF/IDF
BM25模型

exact value(精准匹配)

match_phrase

通过slop参数控制单词间的间隔

query_string

类似于URL Search中的q参数查询

simple_query_string

类似Query string 但是会忽律错误的查询语法,并且仅支持部分查询语法

term

将查询语句作为整个单词进行查询,不会对查询语句做分词处理.

GET blog/paper/_search
{
  "query": {
        "term": {
          "pID": "7ec0e0e5-a4b0-46d7-af56-5b3eab477aea"
        }
  }
}

上面的语句是无法搜索的到的,因为通过使用分词分析,7ec0e0e5-a4b0-46d7-af56-5b3eab477aea会被分拆成4个部分建立倒排索引

POST /blog/_analyze
{
  "text":"7ec0e0e5-a4b0-46d7-af56-5b3eab477aea"
}

但是在es5.0以上版本的可以通过在filed增加keyword就可以查询到,因为text类型数据会创建两份索引,其中一份是长度为256的keyword索引数据

GET blog/paper/_search
{
  "query": {
        "term": {
          "pID.keyword": "7ec0e0e5-a4b0-46d7-af56-5b3eab477aea"
        }
  }
}

当然另外一种方式就是创建mapping,指定pID的类型是keyword,就是不分词处理,但是这个需要在我们往index 中插入数据之前,一旦插入了数据,是不能在创建mapping的,只能通过reindex重新数据迁移。

PUT /blog
{
  "mappings": {
    "paper": {
      "properties": {
        "pID":{
          "type": "keyword"
        }
      }
    }
  }
}

terms

一次传入多个值进行搜索,类似SQL中的in查询语句

SELECT * FROM paper WHERE uID IN (2,3)

与上面的sql 查询等价的es查询语句是

GET blog/paper/_search
{
  "query": {
    "terms": {
      "uID": [
        "2",
        "3"
      ]
    }
  }
}

match_all

获取全部数据

GET blog/paper/_search
{
  "query": {
    "match_all": {}
  }
}

####highlight search高亮搜素结果

GET blog/paper/_search
{
"query": {
"match": {
"title": "java"
}
},
"highlight": {
"fields": {
"title": {}
}
}
}

####Range Query
范围查询主要针对数值和日期类型
|语句|描述|
---|---
gt|greater than|
gte|greater than or equal to|
lt|less than|
lte|less than or equal to|

GET blog/paper/_search
{
"query": {
"range": {
"date": {
"gte": "2018-01-01",
"lte": "2018-10-01"
}
}
}
}

#####date math
针对日期提供的一种更加友好的计算方式now(基准日期)-1d(计算公式)

GET blog/paper/_search
{
"query": {
"range": {
"date": {
"gte": "2018-01-01",
"lte": "now"
}
}
}
}

##boost权重搜索

GET blog/paper/_search
{
"query": {
"bool": {

  "should": [
    {"match": {
      "title": {
        "query": "hadoop",
        "boost":3
      }
    }},
    {"match": {
      "title": {
        "query": "elasticsearch",
         "boost":2
      }
    }}
  ]
}

}
}

##sort
排序

GET blog/paper/_search
{
"query": {
"match": {
"title": "elasticsearch"
}
}
, "sort": [
{
"date": {
"order": "ASC"
}
}
]
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容