zoukankan      html  css  js  c++  java
  • Elasticsearch---DSL搜索实践

    Domain Specific Language
    特定领域语言,基于JSON格式的数据查询,查询更灵活,有利于复杂查询

    更好的阅读体验:http://www.zhouhong.icu/post/137

    一、普通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
            }
        }
    }
    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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://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": "https://www.zhouhong.com/static/img/index/logo.png"   
    }
     4、普通检索:
    • http://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": "https://www.zhouhong.com/static/img/index/logo.png"
                    }
                }
            ]
        }
    }

    二、DSL搜索

    {
    	"query": {
    		"match_all": {}
    	}
    }

    {
    	"query": {
    		"match_all": {}
    	},
    	"_source": ["id","username","age"]
    }

    {
    	"query": {
    		"match_all": {}
    	},
    	"_source": ["id","username","age"],
    	"from": 0,
    	"size": 5
    }

    {
    	"query": {
    		"match_phrase": {
    			"desc": {
    				"query": "今天 车流量",
    				"slop": 100
    			}
    		}
    	}
    }

    {
    	"query": {
    		"term": {
    			"desc": "学习"
    		}
    	}
    }
    •  terms 对多个关键字查询

    {
    	"query": {
    		"terms": {
    			"desc": ["学习","周红","周江"]
    		}
    	}
    }

    {
    	"query": {
    		"match": {
    			"desc": "周红"
    		}
    	},
    	"_source": ["id","username","age"]
    }

    {
    	"query": {
    		"match": {
    			"desc": {
    				"query": "周红",
    				"operator": "and"
    			}
    		}
    	},
    	"_source": ["id","username","age"]
    }
    • POST http://192.168.2.223:9200/shop/_doc/_search
    • ​minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。
    • minimum_should_match 也能设置具体的数字,表示拆分出来的词在一个字段中个数

    {
        "query": {
            "match": {
                "desc": {
                    "query": "女友生日送我好玩的xbox游戏机",
                    "minimum_should_match": "60%"
                }
            }
        }
    } 

    {
    	"query": {
    		"ids": {
    			"type": "_doc",
    			"values": ["1001","1005","1006"]
    		}
    	},
    	"_source": ["id","username","desc"]
    }
    • multi_match 对多个字段进行检索
      • POST http://192.168.2.223:9200/shop/_doc/_search ^10 表示权重,权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。

    {
        "query": {
            "multi_match": {
                "query": "游戏",
                "fields": [
                	"desc^10","nickname"
                ]
            }
        }
    }

    {
        "query": {
            "bool": {
                "must": [
                	{
                		"multi_match": {
                			"query": "游戏",
                			"fields": ["desc","nickname"]
                		}
                	},
                	{
                		"term": {
                			"age": "19"
                		}
                	}
                ]
            }
        }
    }
    • post_filter 过滤器
      • POST http://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"
    		}
    	},
    	"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"
                    }
                }
            }
        }
    }
    2.插入数据
    POST         /shop2/_doc
    {
        "id": 1001,
        "nickname": "美丽的风景"
    }
    {
        "id": 1002,
        "nickname": "漂亮的小哥哥"
    }
    {
        "id": 1003,
        "nickname": "飞翔的巨鹰"
    }
    {
        "id": 1004,
        "nickname": "完美的天空"
    }
    {
        "id": 1005,
        "nickname": "广阔的海域"
    }
    3.排序     POST    http://192.168.2.223:9200/shop2/_doc/_search
    {
        "sort": [
            {
                "nickname.keyword": "desc"
            }
        ]
    }

    {
    	"query": {
    		"exists": {
    			"field": "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": "https://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": "https://www.zhouhong.com/static/img/index/logo.png"
                    },
                    "highlight": {
                        "desc": [
                            "我叫<em>周红</em>,今年20岁,是一名毕业生,我在琦䯲星球做演讲"
                        ]
                    }
                }
            ]
        }
    }

    输了不可怕,大不了从头再来,我们还年轻---周红

  • 相关阅读:
    Inner Classes with TypeScript
    设计模式(一)
    C++定义构造函数必须使用初始化列表的场合
    制作Linux下程序安装包——使用脚本打包bin、run等安装包
    Windows下将程序打包为安装包(最为简易的方式)
    在Linux中查看文件的编码及对文件进行编码转换
    libpcap文件格式分析
    static_cast, dynamic_cast, const_cast
    字符1与数字1
    Linux下的多线程编程
  • 原文地址:https://www.cnblogs.com/Tom-shushu/p/14433888.html
Copyright © 2011-2022 走看看