一 . ES的基本语法
文章目录
测试数据内容:
PUT /product/_doc/1
{
"name" : "xiaomi phone",
"desc" : "shouji zhong de zhandouji",
"price" : 3999,
"tags": [ "xingjiabi", "fashao", "buka" ]
}
PUT /product/_doc/2
{
"name" : "xiaomi nfc phone",
"desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji",
"price" : 4999,
"tags": [ "xingjiabi", "fashao", "gongjiaoka" ]
}
PUT /product/_doc/3
{
"name" : "nfc phone",
"desc" : "shouji zhong de hongzhaji",
"price" : 2999,
"tags": [ "xingjiabi", "fashao", "menjinka" ]
}
PUT /product/_doc/4
{
"name" : "xiaomi erji",
"desc" : "erji zhong de huangmenji",
"price" : 999,
"tags": [ "low", "bufangshui", "yinzhicha" ]
}
PUT /product/_doc/5
{
"name" : "hongmi erji",
"desc" : "erji zhong de kendeji",
"price" : 399,
"tags": [ "lowbee", "xuhangduan", "zhiliangx" ]
}
1.Query String 语法
① timeout - - - 设置超时时间
GET /_search?timeout=1s
② eq 语法
GET /_search/?q=name:xiaomi
③ 分页 from= 第几页面&size=每页显示的个数&sort=price:asc
注意:
按照字段排序之后查询结果score为null
2.Query DSL 语法
① match_all - – -匹配所有
#匹配所有
GET /product/_search
{
"query":{
"match_all":{}
}
}
② match - - -根据属性的值去匹配
#根据具体的内容匹配
GET /product/_search
{
"query":{
"match": {
"name": "nfc"
}
}
}
③ multi_match —多个字段匹配
#多字段匹配
GET /product/_search
{
"query":{
"multi_match":{
"query":"nfc",
"fields":["name","desc"]
}
}
}
④ _source - - -元数据只查询指定的字段不查询所有的字段
GET /product/_search
{
"query":{
"match":{
"name":"nfc"
}
},
"_source":["name"]
}
查询结果
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.90928507,
"hits": [
{
"_index": "product",
"_id": "3",
"_score": 0.90928507,
"_source": {
"name": "nfc phone"
}
},
{
"_index": "product",
"_id": "2",
"_score": 0.76209855,
"_source": {
"name": "xiaomi nfc phone"
}
}
]
}
}
⑤ 分页 from size
# 分页
GET /product/_search
{
"query":{
"match_all": {}
},
"from":1,
"size":2
}
3. Full-text queries 全文检索
① query-term:查询字段不会被分词
#query-term
GET /product/_search
{
"query":{
"term": {
"name":"nfc"
}
}
}
② match 和 term 的区别
- 用term查询name为“”“nfc phone”的结果
GET /product/_search
{
"query":{
"term": {
"name":"nfc phone" --这里没有分词 所以查询不到结果
}
}
}
term
和match
的区别?
term
是完全匹配,也就是精确查询。搜索前不会对搜索词在进行分词。
match
是模糊匹配,首先会对搜索词进行相应得分词,在进行查询。
③ analyze - - - 验证分词
#验证分词
GET /_analyze
{
"analyzer":"standard",
"text":"xiaomi nfc zhineng phone"
}
分词结果
{
"tokens": [
{
"token": "xiaomi",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "nfc",
"start_offset": 7,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "zhineng",
"start_offset": 11,
"end_offset": 18,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "phone",
"start_offset": 19,
"end_offset": 24,
"type": "<ALPHANUM>",
"position": 3
}
]
}
4. Phrase search 短语搜索
短语搜索和全文搜索相反。举个例子“nfc phone”回座位一个短语去搜索
#短语搜索
GET /product/_search
{
"query":{
"match_phrase": {
"name": "nfc phone"
}
}
}
搜索结果查的是name
里面包含nfc phone
的值
5.Query and filter 查询和过滤
① bool
:可以组合多个查询条件,bool
查询也是采用 more_matches_is_better的机制,因此满足must
和should
子句的文档将会合并起来计算分值。
- must:必须满足
子句(查询)必须出现在匹配的文档中,并将有助于得分
filter
:过滤器 不计算相关度分数
子句(查询)必须出现在匹配的文档中。但是不像
must
查询的分数将会被忽略。Filter
子句在filter
上下文中执行,这意味着计分被忽略,并且子句被考虑用户缓存。
- should:可能满足等价于
or
子句(查询)应出现在匹配的文档中。
- must not:必须不满足 不计算相关度分数相当于
not
的意思
子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为缓存。由于忽略计分,0因此将返回所有文档的分数。
- minimun should match
顾名思义:最低匹配度,即条件在倒排索引中最低的匹配度。
a.传入参数为数字
b. 传入的参数为百分比
c. 组合方式
d. 多种组合条件
② demo 案例
首先筛选出
name
包含“xiaomi phone” 并且价格大于1999的数据(不排序),然后
搜索name
包含“xiaomi” 和“desc
”包含“shouji”
GET /product/_search
{
"query":{
"bool":{
"must": [
{"match": {"name": "xiaomi" }},
{"match": {"desc": "shouji" }}
],
"filter": [
{"match_phrase":{"name":"xiaomi phone"}},
{"range": {"price": {"gte": 1999}}}
]
}
}
}
查询结果
2.
bool
多条件name
包含xiaomi
不包含erji
描述里包不包含nfc
都可以,price
要大于等于4999
# bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
GET /product/_search
{
"query":{
"bool":{
"must": [{"match": {"name": "xiaomi"}}],
"must_not": [{"match": {"name": "erji"}}],
"should": [{"match": {"name": "nfc"}}],
"filter": [
{"range": {
"price": {
"gte": 4999
}
}}
]
}
}
}
查询显示
③ 嵌套查询
- minium should match :参数指定
should
返回的文档必须匹配子句的数量和百分百。如果bool
查询包含至少一个should
子句,而没有must
或filter
子句,则默认值为1
。否则,默认值为0
案例:筛选出
name
中包含nfc
的,价格可以大于1999或者3999
#组合查询
GET /product/_search
{
"query":{
"bool":{
"must": [
{"match": {
"name": "nfc"
}}
],
"should": [
{"range": {
"price": {
"gt": 1999
}
}},
{"range": {
"price": {
"gt": 3999
}
}}
],
"minimum_should_match": 1
}
}
}
查询结果
6. Compound queries 查询
① constant_score
constant_score:本意(常量分数),可以将一个不变的常量应用到所有匹配的文档中。它常用于只需要执行一个filter而没有其他查询(例如评分查询)的情况下。term查询被放置在constant_score中,转换成不评分的filter。这种方式可以用来只有filter的bool查询中。
相关性得分的计算规则:
每一个子查询都独自计算doc的相关性得分,一旦他们的得分被计算出来,bool查询就将这些得分进行合并并且返回一个代表整个bool操作的得分。
bool中只有filter操作,故使用constant_score代替了filter操作,且为每一个子查询设置了常量分数。
案例: 想要一台带NFC功能的 或者 小米的手机 但是不要耳机
GET /product/_search
{
"query":{
"constant_score": {
"filter": {
"bool": {
"should":[
{"term":{"name":"xiaomi"}},
{"term":{"name":"nfc"}}
],
"must_not":[
{"term":{"name":"erji"}}
]
}
},
"boost": 1.2
}
}
}
查询结果
constance_score 这种方式的查询影响的每个子查询的相关度分数,把每个子查询的相关度分数都设置为常量,忽略 TF/IDF 信息。
7.HighLight search(高亮显示)
# 高亮显示
GET /product/_search
{
"query":{
"match_phrase": {
"name": "nfc phone"
}
},
"highlight":{
"fields": {
"name":{}
}
}
}
查询显示