Elasticsearch—DSL搜索实践
Domain Specific Language
特定领域语言,基于JSON格式的数据查询,查询更灵活,有利于复杂查询
一、普通url路径参数搜索
- 数据准备
1.建立名字为 shop 的索引
2.手动建立mappings
POST http://192.168.2.223:9200/shop/_mapping { "properties": { "id": { "type": "long" }, "age": { "type": "integer" }, "username": { "type": "keyword" }, "nickname": { "type": "text", "analyzer": "ik_max_word" }, "money": { "type": "float" }, "desc": { "type": "text", "analyzer": "ik_max_word" }, "sex": { "type": "byte" }, "birthday": { "type": "date" }, "face": { "type": "text", "index": false } } }
View Code
3.添加数据
POST http://192.168.2.223:9200/shop/_doc/1001 { "id": 1011, "age": 31, "username": "sprder", "nickname": "皮特帕克", "money": 180.8, "desc": "它是一个超级英雄", "sex": 1, "birthday": "1989-08-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1008, "age": 19, "username": "zhoujiang", "nickname": "周江", "money": 1056.8, "desc": "周江大学毕业后,进了阿里", "sex": 1, "birthday": "1995-06-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1007, "age": 19, "username": "msgame", "nickname": "gamexbox", "money": 1056.8, "desc": "明天去进货,最近微软处理很多游戏机,还要买xbox游戏卡带", "sex": 1, "birthday": "1985-05-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1003, "age": 20, "username": "bigFace", "nickname": "飞翔的巨鹰", "money": 66.8, "desc": "周江和导游坐飞机去海外旅游,去了新马泰和欧洲", "sex": 1, "birthday": "1996-01-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1002, "age": 19, "username": "zhouhong", "nickname": "周红", "money": 77.8, "desc": "今天上下班都很堵,车流量很大", "sex": 1, "birthday": "1993-01-24", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1012, "age": 31, "username": "super hero", "nickname": "super hero", "money": 188.8, "desc": "BatMan, GreenArrow, SpiderMan, IronMan... are all Super Hero", "sex": 1, "birthday": "1980-08-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1010, "age": 30, "username": "tata", "nickname": "隔壁老王", "money": 100.8, "desc": "隔壁老外去国外出差,带给我很多好吃的", "sex": 1, "birthday": "1988-07-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1009, "age": 22, "username": "shaonian", "nickname": "骚年轮", "money": 96.8, "desc": "骚年在大学毕业后,考研究生去了", "sex": 1, "birthday": "1998-07-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1006, "age": 19, "username": "zhouhong", "nickname": "我叫周红", "money": 156.8, "desc": "我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲", "sex": 1, "birthday": "1993-04-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1005, "age": 25, "username": "gotoplay", "nickname": "ps游戏机", "money": 155.8, "desc": "今年生日,女友送了我一台play station游戏机,非常好玩,非常不错", "sex": 1, "birthday": "1989-03-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1004, "age": 22, "username": "flyfish", "nickname": "水中鱼", "money": 55.8, "desc": "昨天周红在学校的池塘里,看到有很多鱼在游泳", "sex": 0, "birthday": "1988-02-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } { "id": 1001, "age": 18, "username": "zhoujiang", "nickname": "周江", "money": 88.8, "desc": "周江在大学学习java和前端", "sex": 0, "birthday": "1992-12-24", "face": "//www.zhouhong.com/static/img/index/logo.png" }
View Code
二、检索:
普通检索:
- //192.168.2.223:9200/shop/_search?q=desc:周红&q=age:20
-
{ "took": 8, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 1, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shop", "_type": "_doc", "_id": "1003", "_score": 1, "_source": { "id": 1003, "age": 20, "username": "bigFace", "nickname": "飞翔的巨鹰", "money": 66.8, "desc": "周江和导游坐飞机去海外旅游,去了新马泰和欧洲", "sex": 1, "birthday": "1996-01-14", "face": "//www.zhouhong.com/static/img/index/logo.png" } } ] } }
View Code
DSL检索:
- match_all 检索
- 查询所有:POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match_all": {} } }
- 查询部分字段 : POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match_all": {} }, "_source": ["id","username","age"] }
- 分页查询: POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match_all": {} }, "_source": ["id","username","age"], "from": 0, "size": 5 }
- match_phrase 查询同一个字段中几个词,可以跳过其他词,slop表示可以跳过的最大词数
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match_phrase": { "desc": { "query": "今天 车流量", "slop": 100 } } } }
- term 单个条件查询(不会进行分词、将输入字符当做关键字查找,精确匹配)
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "term": { "desc": "学习" } } }
- terms 对个关键字查询
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "terms": { "desc": ["学习","周红","周江"] } } }
- match 条件查询(会对输入的字符进行分词操作、全文检索):
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match": { "desc": "周红" } }, "_source": ["id","username","age"] }
- POST //192.168.2.223:9200/shop/_doc/_search operator 为 “or”表示:字段只要有一个分词就可以查出来,operator 为 “and”表示:字段必须包含分词分出来的所有字段。
-
{ "query": { "match": { "desc": { "query": "周红", "operator": "and" } } }, "_source": ["id","username","age"] }
- POST //192.168.2.223:9200/shop/_doc/_search
- minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10×70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8×70%=5.6,则desc中至少需要有5个词语匹配,就展示。
- minimum_should_match 也能设置具体的数字,表示拆分出来的词在一个字段中个数
-
{ "query": { "match": { "desc": { "query": "女友生日送我好玩的xbox游戏机", "minimum_should_match": "60%" } } } }
- POST //192.168.2.223:9200/shop/_doc/_search 根据文档 ids 进行查找
-
{ "query": { "ids": { "type": "_doc", "values": ["1001","1005","1006"] } }, "_source": ["id","username","desc"] }
- multi_match 对多个字段进行检索
- POST //192.168.2.223:9200/shop/_doc/_search ^10 表示权重,权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。
-
{ "query": { "multi_match": { "query": "游戏", "fields": [ "desc^10","nickname" ] } } }
- bool 查询
- POST //192.168.2.223:9200/shop/_doc/_search
- must :多个条件全部要满足, should:或者的意思,满足一个条件即可,must_not :除了满足所有条件剩下的数据。
-
{ "query": { "bool": { "must": [ { "multi_match": { "query": "游戏", "fields": ["desc","nickname"] } }, { "term": { "age": "19" } } ] } } }
- post_filter 过滤器
- POST //192.168.2.223:9200/shop/_doc/_search
- 对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。
使用场景:
- query:根据用户搜索条件检索匹配记录
- post_filter:用于查询后,对结果数据的筛选
实操:查询账户金额大于80元,小于等于155.8元的用户
gte:大于等于
lte:小于等于
gt:大于
lt:小于
{ "query": { "match": { "sex": "1" } }, "post_filter": { "range": { "money": { "gte": 60, "lte": 155.8 } } } }
- sort 排序功能
- POST //192.168.2.223:9200/shop/_doc/_search 先以money排序再以age排序,注意:只能对整形排序,不能对文本类型排序。
-
{ "query": { "match": { "sex": "1" } }, "sort": [ { "money": "asc" }, { "age": "asc" } ] }
- 对文本排序
- 需要对排序字段加一个附加属性,类型选择为keyword
-
1.创建索引 POST /shop2/_mapping { "properties": { "id": { "type": "long" }, "nickname": { "type": "text", "analyzer": "ik_max_word", "fields": { "keyword": { "type": "keyword" } } } } }
View Code
2.插入数据 POST /shop2/_doc { "id": 1001, "nickname": "美丽的风景" } { "id": 1002, "nickname": "漂亮的小哥哥" } { "id": 1003, "nickname": "飞翔的巨鹰" } { "id": 1004, "nickname": "完美的天空" } { "id": 1005, "nickname": "广阔的海域" }
View Code
3.排序 POST http://192.168.2.223:9200/shop2/_doc/_search { "sort": [ { "nickname.keyword": "desc" } ] }
- exists 判断字段是否存在
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "exists": { "field": "desc" } } }
- highlight 关键字高亮显示
- POST //192.168.2.223:9200/shop/_doc/_search
-
{ "query": { "match": { "desc": "周红" } }, "highlight": { "pre_tags": ["<span>"], "post_tags": ["</span>"], "fields": { "desc": {} } } }
结果:默认为em标签,上面设置为自定义的<span>标签,对页面 em/span 标签做一个颜色设置就可以实现高亮显示了。 -
{ "took": 110, "timed_out": false, "_shards": { "total": 3, "successful": 3, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 1.1329247, "hits": [ { "_index": "shop", "_type": "_doc", "_id": "1004", "_score": 1.1329247, "_source": { "id": 1004, "age": 22, "username": "flyfish", "nickname": "水中鱼", "money": 55.8, "desc": "昨天周红在学校的池塘里,看到有很多鱼在游泳", "sex": 0, "birthday": "1988-02-14", "face": "//www.zhouhong.com/static/img/index/logo.png" }, "highlight": { "desc": [ "昨天<em>周红</em>在学校的池塘里,看到有很多鱼在游泳" ] } }, { "_index": "shop", "_type": "_doc", "_id": "1006", "_score": 0.9585575, "_source": { "id": 1006, "age": 19, "username": "zhouhong", "nickname": "我叫周红", "money": 156.8, "desc": "我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲", "sex": 1, "birthday": "1993-04-14", "face": "//www.zhouhong.com/static/img/index/logo.png" }, "highlight": { "desc": [ "我叫<em>周红</em>,今年20岁,是一名毕业生,我在琦䯲星球做演讲" ] } } ] }
View Code
Domain Specific Language
特定领域语言,基于JSON格式的数据查询,查询更灵活,有利于复杂查询
一、普通url路径参数搜索
- 数据准备
1.建立名字为 shop 的索引
2.手动建立mappings
POST //192.168.2.223:9200/shop/_mapping
{
“properties”: {
“id”: {
“type”: “long”
},
“age”: {
“type”: “integer”
},
“username”: {
“type”: “keyword”
},
“nickname”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“money”: {
“type”: “float”
},
“desc”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“sex”: {
“type”: “byte”
},
“birthday”: {
“type”: “date”
},
“face”: {
“type”: “text”,
“index”: false
}
}
}
{
“properties”: {
“id”: {
“type”: “long”
},
“age”: {
“type”: “integer”
},
“username”: {
“type”: “keyword”
},
“nickname”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“money”: {
“type”: “float”
},
“desc”: {
“type”: “text”,
“analyzer”: “ik_max_word”
},
“sex”: {
“type”: “byte”
},
“birthday”: {
“type”: “date”
},
“face”: {
“type”: “text”,
“index”: false
}
}
}
3.添加数据
POST //192.168.2.223:9200/shop/_doc/1001
{
“id”: 1011,
“age”: 31,
“username”: “sprder”,
“nickname”: “皮特帕克”,
“money”: 180.8,
“desc”: “它是一个超级英雄”,
“sex”: 1,
“birthday”: “1989-08-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1008,
“age”: 19,
“username”: “zhoujiang”,
“nickname”: “周江”,
“money”: 1056.8,
“desc”: “周江大学毕业后,进了阿里”,
“sex”: 1,
“birthday”: “1995-06-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1007,
“age”: 19,
“username”: “msgame”,
“nickname”: “gamexbox”,
“money”: 1056.8,
“desc”: “明天去进货,最近微软处理很多游戏机,还要买xbox游戏卡带”,
“sex”: 1,
“birthday”: “1985-05-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1003,
“age”: 20,
“username”: “bigFace”,
“nickname”: “飞翔的巨鹰”,
“money”: 66.8,
“desc”: “周江和导游坐飞机去海外旅游,去了新马泰和欧洲”,
“sex”: 1,
“birthday”: “1996-01-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1002,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “周红”,
“money”: 77.8,
“desc”: “今天上下班都很堵,车流量很大”,
“sex”: 1,
“birthday”: “1993-01-24”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1012,
“age”: 31,
“username”: “super hero”,
“nickname”: “super hero”,
“money”: 188.8,
“desc”: “BatMan, GreenArrow, SpiderMan, IronMan… are all Super Hero”,
“sex”: 1,
“birthday”: “1980-08-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1010,
“age”: 30,
“username”: “tata”,
“nickname”: “隔壁老王”,
“money”: 100.8,
“desc”: “隔壁老外去国外出差,带给我很多好吃的”,
“sex”: 1,
“birthday”: “1988-07-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1009,
“age”: 22,
“username”: “shaonian”,
“nickname”: “骚年轮”,
“money”: 96.8,
“desc”: “骚年在大学毕业后,考研究生去了”,
“sex”: 1,
“birthday”: “1998-07-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1006,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “我叫周红”,
“money”: 156.8,
“desc”: “我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲”,
“sex”: 1,
“birthday”: “1993-04-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1005,
“age”: 25,
“username”: “gotoplay”,
“nickname”: “ps游戏机”,
“money”: 155.8,
“desc”: “今年生日,女友送了我一台play station游戏机,非常好玩,非常不错”,
“sex”: 1,
“birthday”: “1989-03-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1004,
“age”: 22,
“username”: “flyfish”,
“nickname”: “水中鱼”,
“money”: 55.8,
“desc”: “昨天周红在学校的池塘里,看到有很多鱼在游泳”,
“sex”: 0,
“birthday”: “1988-02-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1001,
“age”: 18,
“username”: “zhoujiang”,
“nickname”: “周江”,
“money”: 88.8,
“desc”: “周江在大学学习java和前端”,
“sex”: 0,
“birthday”: “1992-12-24”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1011,
“age”: 31,
“username”: “sprder”,
“nickname”: “皮特帕克”,
“money”: 180.8,
“desc”: “它是一个超级英雄”,
“sex”: 1,
“birthday”: “1989-08-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1008,
“age”: 19,
“username”: “zhoujiang”,
“nickname”: “周江”,
“money”: 1056.8,
“desc”: “周江大学毕业后,进了阿里”,
“sex”: 1,
“birthday”: “1995-06-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1007,
“age”: 19,
“username”: “msgame”,
“nickname”: “gamexbox”,
“money”: 1056.8,
“desc”: “明天去进货,最近微软处理很多游戏机,还要买xbox游戏卡带”,
“sex”: 1,
“birthday”: “1985-05-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1003,
“age”: 20,
“username”: “bigFace”,
“nickname”: “飞翔的巨鹰”,
“money”: 66.8,
“desc”: “周江和导游坐飞机去海外旅游,去了新马泰和欧洲”,
“sex”: 1,
“birthday”: “1996-01-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1002,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “周红”,
“money”: 77.8,
“desc”: “今天上下班都很堵,车流量很大”,
“sex”: 1,
“birthday”: “1993-01-24”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1012,
“age”: 31,
“username”: “super hero”,
“nickname”: “super hero”,
“money”: 188.8,
“desc”: “BatMan, GreenArrow, SpiderMan, IronMan… are all Super Hero”,
“sex”: 1,
“birthday”: “1980-08-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1010,
“age”: 30,
“username”: “tata”,
“nickname”: “隔壁老王”,
“money”: 100.8,
“desc”: “隔壁老外去国外出差,带给我很多好吃的”,
“sex”: 1,
“birthday”: “1988-07-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1009,
“age”: 22,
“username”: “shaonian”,
“nickname”: “骚年轮”,
“money”: 96.8,
“desc”: “骚年在大学毕业后,考研究生去了”,
“sex”: 1,
“birthday”: “1998-07-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1006,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “我叫周红”,
“money”: 156.8,
“desc”: “我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲”,
“sex”: 1,
“birthday”: “1993-04-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1005,
“age”: 25,
“username”: “gotoplay”,
“nickname”: “ps游戏机”,
“money”: 155.8,
“desc”: “今年生日,女友送了我一台play station游戏机,非常好玩,非常不错”,
“sex”: 1,
“birthday”: “1989-03-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1004,
“age”: 22,
“username”: “flyfish”,
“nickname”: “水中鱼”,
“money”: 55.8,
“desc”: “昨天周红在学校的池塘里,看到有很多鱼在游泳”,
“sex”: 0,
“birthday”: “1988-02-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
{
“id”: 1001,
“age”: 18,
“username”: “zhoujiang”,
“nickname”: “周江”,
“money”: 88.8,
“desc”: “周江在大学学习java和前端”,
“sex”: 0,
“birthday”: “1992-12-24”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
二、检索:
- //192.168.2.223:9200/shop/_search?q=desc:周红&q=age:20
{
“took”: 8,
“timed_out”: false,
“_shards”: {
“total”: 3,
“successful”: 3,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 1,
“relation”: “eq”
},
“max_score”: 1,
“hits”: [
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1003”,
“_score”: 1,
“_source”: {
“id”: 1003,
“age”: 20,
“username”: “bigFace”,
“nickname”: “飞翔的巨鹰”,
“money”: 66.8,
“desc”: “周江和导游坐飞机去海外旅游,去了新马泰和欧洲”,
“sex”: 1,
“birthday”: “1996-01-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
}
]
}
}
“took”: 8,
“timed_out”: false,
“_shards”: {
“total”: 3,
“successful”: 3,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 1,
“relation”: “eq”
},
“max_score”: 1,
“hits”: [
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1003”,
“_score”: 1,
“_source”: {
“id”: 1003,
“age”: 20,
“username”: “bigFace”,
“nickname”: “飞翔的巨鹰”,
“money”: 66.8,
“desc”: “周江和导游坐飞机去海外旅游,去了新马泰和欧洲”,
“sex”: 1,
“birthday”: “1996-01-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
}
}
]
}
}
二、DSL搜索
- match_all 检索
- 查询所有:POST //192.168.2.223:9200/shop/_doc/_search
{
“query”: {
“match_all”: {}
}
}
“query”: {
“match_all”: {}
}
}
- 查询部分字段 : POST //192.168.2.223:9200/shop/_doc/_search
{
“query”: {
“match_all”: {}
},
“_source”: [“id”,”username”,”age”]
}
“query”: {
“match_all”: {}
},
“_source”: [“id”,”username”,”age”]
}
- 分页查询: POST //192.168.2.223:9200/shop/_doc/_search
{
“query”: {
“match_all”: {}
},
“_source”: [“id”,”username”,”age”],
“from”: 0,
“size”: 5
}
“query”: {
“match_all”: {}
},
“_source”: [“id”,”username”,”age”],
“from”: 0,
“size”: 5
}
- match_phrase 查询同一个字段中几个词,可以跳过其他词,slop表示可以跳过的最大词数
{
“query”: {
“match_phrase”: {
“desc”: {
“query”: “今天 车流量”,
“slop”: 100
}
}
}
}
“query”: {
“match_phrase”: {
“desc”: {
“query”: “今天 车流量”,
“slop”: 100
}
}
}
}
- term 单个条件查询(不会进行分词、将输入字符当做关键字查找,精确匹配)
{
“query”: {
“term”: {
“desc”: “学习”
}
}
}
“query”: {
“term”: {
“desc”: “学习”
}
}
}
- terms 对个关键字查询
{
“query”: {
“terms”: {
“desc”: [“学习”,”周红”,”周江”]
}
}
}
“query”: {
“terms”: {
“desc”: [“学习”,”周红”,”周江”]
}
}
}
- match 条件查询(会对输入的字符进行分词操作、全文检索):
{
“query”: {
“match”: {
“desc”: “周红”
}
},
“_source”: [“id”,”username”,”age”]
}
“query”: {
“match”: {
“desc”: “周红”
}
},
“_source”: [“id”,”username”,”age”]
}
- POST //192.168.2.223:9200/shop/_doc/_search operator 为 “or”表示:字段只要有一个分词就可以查出来,operator 为 “and”表示:字段必须包含分词分出来的所有字段。
{
“query”: {
“match”: {
“desc”: {
“query”: “周红”,
“operator”: “and”
}
}
},
“_source”: [“id”,”username”,”age”]
}
“query”: {
“match”: {
“desc”: {
“query”: “周红”,
“operator”: “and”
}
}
},
“_source”: [“id”,”username”,”age”]
}
- POST //192.168.2.223:9200/shop/_doc/_search
- minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10×70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8×70%=5.6,则desc中至少需要有5个词语匹配,就展示。
- minimum_should_match 也能设置具体的数字,表示拆分出来的词在一个字段中个数
{
“query”: {
“match”: {
“desc”: {
“query”: “女友生日送我好玩的xbox游戏机”,
“minimum_should_match”: “60%”
}
}
}
}
“query”: {
“match”: {
“desc”: {
“query”: “女友生日送我好玩的xbox游戏机”,
“minimum_should_match”: “60%”
}
}
}
}
- POST //192.168.2.223:9200/shop/_doc/_search 根据文档 ids 进行查找
{
“query”: {
“ids”: {
“type”: “_doc”,
“values”: [“1001″,”1005″,”1006”]
}
},
“_source”: [“id”,”username”,”desc”]
}
“query”: {
“ids”: {
“type”: “_doc”,
“values”: [“1001″,”1005″,”1006”]
}
},
“_source”: [“id”,”username”,”desc”]
}
- multi_match 对多个字段进行检索
- POST //192.168.2.223:9200/shop/_doc/_search ^10 表示权重,权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。
{
“query”: {
“multi_match”: {
“query”: “游戏”,
“fields”: [
“desc^10″,”nickname”
]
}
}
}
“query”: {
“multi_match”: {
“query”: “游戏”,
“fields”: [
“desc^10″,”nickname”
]
}
}
}
- bool 查询
- POST //192.168.2.223:9200/shop/_doc/_search
- must :多个条件全部要满足, should:或者的意思,满足一个条件即可,must_not :除了满足所有条件剩下的数据。
{
“query”: {
“bool”: {
“must”: [
{
“multi_match”: {
“query”: “游戏”,
“fields”: [“desc”,”nickname”]
}
},
{
“term”: {
“age”: “19”
}
}
]
}
}
}
“query”: {
“bool”: {
“must”: [
{
“multi_match”: {
“query”: “游戏”,
“fields”: [“desc”,”nickname”]
}
},
{
“term”: {
“age”: “19”
}
}
]
}
}
}
- post_filter 过滤器
- POST //192.168.2.223:9200/shop/_doc/_search
- 对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。
使用场景:
- query:根据用户搜索条件检索匹配记录
- post_filter:用于查询后,对结果数据的筛选
实操:查询账户金额大于80元,小于等于155.8元的用户
gte:大于等于
lte:小于等于
gt:大于
lt:小于
{
“query”: {
“match”: {
“sex”: “1”
}
},
“post_filter”: {
“range”: {
“money”: {
“gte”: 60,
“lte”: 155.8
}
}
}
}
“query”: {
“match”: {
“sex”: “1”
}
},
“post_filter”: {
“range”: {
“money”: {
“gte”: 60,
“lte”: 155.8
}
}
}
}
- sort 排序功能
- POST //192.168.2.223:9200/shop/_doc/_search 先以money排序再以age排序,注意:只能对整形排序,不能对文本类型排序。
{
“query”: {
“match”: {
“sex”: “1”
}
},
“sort”: [
{
“money”: “asc”
},
{
“age”: “asc”
}
]
}
“query”: {
“match”: {
“sex”: “1”
}
},
“sort”: [
{
“money”: “asc”
},
{
“age”: “asc”
}
]
}
- 对文本排序
- 需要对排序字段加一个附加属性,类型选择为keyword
1.创建索引
POST /shop2/_mapping
{
“properties”: {
“id”: {
“type”: “long”
},
“nickname”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“fields”: {
“keyword”: {
“type”: “keyword”
}
}
}
}
}
POST /shop2/_mapping
{
“properties”: {
“id”: {
“type”: “long”
},
“nickname”: {
“type”: “text”,
“analyzer”: “ik_max_word”,
“fields”: {
“keyword”: {
“type”: “keyword”
}
}
}
}
}
2.插入数据
POST /shop2/_doc
{
“id”: 1001,
“nickname”: “美丽的风景”
}
{
“id”: 1002,
“nickname”: “漂亮的小哥哥”
}
{
“id”: 1003,
“nickname”: “飞翔的巨鹰”
}
{
“id”: 1004,
“nickname”: “完美的天空”
}
{
“id”: 1005,
“nickname”: “广阔的海域”
}
POST /shop2/_doc
{
“id”: 1001,
“nickname”: “美丽的风景”
}
{
“id”: 1002,
“nickname”: “漂亮的小哥哥”
}
{
“id”: 1003,
“nickname”: “飞翔的巨鹰”
}
{
“id”: 1004,
“nickname”: “完美的天空”
}
{
“id”: 1005,
“nickname”: “广阔的海域”
}
3.排序 POST //192.168.2.223:9200/shop2/_doc/_search
{
“sort”: [
{
“nickname.keyword”: “desc”
}
]
}
{
“sort”: [
{
“nickname.keyword”: “desc”
}
]
}
- exists 判断字段是否存在
{
“query”: {
“exists”: {
“field”: “desc”
}
}
}
“query”: {
“exists”: {
“field”: “desc”
}
}
}
- highlight 关键字高亮显示
{
“query”: {
“match”: {
“desc”: “周红”
}
},
“highlight”: {
“pre_tags”: [“<span>”],
“post_tags”: [“</span>”],
“fields”: {
“desc”: {}
}
}
}
“query”: {
“match”: {
“desc”: “周红”
}
},
“highlight”: {
“pre_tags”: [“<span>”],
“post_tags”: [“</span>”],
“fields”: {
“desc”: {}
}
}
}
结果:默认为em标签,上面设置为自定义的<span>标签,对页面 em/span 标签做一个颜色设置就可以实现高亮显示了。
{
“took”: 110,
“timed_out”: false,
“_shards”: {
“total”: 3,
“successful”: 3,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 1.1329247,
“hits”: [
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1004”,
“_score”: 1.1329247,
“_source”: {
“id”: 1004,
“age”: 22,
“username”: “flyfish”,
“nickname”: “水中鱼”,
“money”: 55.8,
“desc”: “昨天周红在学校的池塘里,看到有很多鱼在游泳”,
“sex”: 0,
“birthday”: “1988-02-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
},
“highlight”: {
“desc”: [
“昨天<em>周红</em>在学校的池塘里,看到有很多鱼在游泳”
]
}
},
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1006”,
“_score”: 0.9585575,
“_source”: {
“id”: 1006,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “我叫周红”,
“money”: 156.8,
“desc”: “我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲”,
“sex”: 1,
“birthday”: “1993-04-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
},
“highlight”: {
“desc”: [
“我叫<em>周红</em>,今年20岁,是一名毕业生,我在琦䯲星球做演讲”
]
}
}
]
}
}
“took”: 110,
“timed_out”: false,
“_shards”: {
“total”: 3,
“successful”: 3,
“skipped”: 0,
“failed”: 0
},
“hits”: {
“total”: {
“value”: 2,
“relation”: “eq”
},
“max_score”: 1.1329247,
“hits”: [
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1004”,
“_score”: 1.1329247,
“_source”: {
“id”: 1004,
“age”: 22,
“username”: “flyfish”,
“nickname”: “水中鱼”,
“money”: 55.8,
“desc”: “昨天周红在学校的池塘里,看到有很多鱼在游泳”,
“sex”: 0,
“birthday”: “1988-02-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
},
“highlight”: {
“desc”: [
“昨天<em>周红</em>在学校的池塘里,看到有很多鱼在游泳”
]
}
},
{
“_index”: “shop”,
“_type”: “_doc”,
“_id”: “1006”,
“_score”: 0.9585575,
“_source”: {
“id”: 1006,
“age”: 19,
“username”: “zhouhong”,
“nickname”: “我叫周红”,
“money”: 156.8,
“desc”: “我叫周红,今年20岁,是一名毕业生,我在琦䯲星球做演讲”,
“sex”: 1,
“birthday”: “1993-04-14”,
“face”: “//www.zhouhong.com/static/img/index/logo.png”
},
“highlight”: {
“desc”: [
“我叫<em>周红</em>,今年20岁,是一名毕业生,我在琦䯲星球做演讲”
]
}
}
]
}
}