当前位置: 首页 > 后端技术 > PHP

【Elasticsearch入门到弃系列】精通Elasticsearch入门查询

时间:2023-03-30 02:45:20 PHP

前言突然想写一篇Elasticsearch基本使用的文档,因为Elasticsearch入门门槛很低,没用过许久。最近,该项目已连接到Elasticsearch。想了想还是先写一篇基本使用的文章,以后再写一篇文章来打散分析Elasticsearch。本文不会再有表情包,是一本比较严肃的新手入门手册。老板,请绕道!!!谦卑的在线祈祷。看完这篇文章,你对Elasticsearch还是一无所知哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈所有的官方网站文件都是唯一的。大家可以根据代码环境准备自己的环境。.2dockerrun-d--nameelasticsearch-p9200:9200-p9300:9300-e"discovery.type=single-node"elasticsearch:6.7.2//已经启动成功,不需要再操作2.其次你可以命令php其实把demo改成任何语言都非常简单大概有1000个数据源。按照下面的执行脚本,在data/user_list.json中自动构建数据文件数据准备如果用惯了mysql,可以换个概念mysql->databases->talbes->rows->Columselasticsearch->Inices->Types->Documents->Fields来自elasticsearch权威指南。该演示以一个简单的用户为例。user_id需要查询用户id的昵称范围,用户昵称需要精确查询tag。description用户画像需要分词查询{//用户id"user_id":1,//用户昵称"nickname":"洪二光",//用户标签"tag":["无情男","菜鸟"],//出生日期"birthday":"1994-11-30",//邮箱"mail":"1569498875@qq.com",//用户备注"description":"ohshit"}index定义为usertype并定义为_docbuildindex//按照命令执行数据自动构建成功phpsrc/build_index.php理解mapping和analysis这两个概念通俗解释mapping决定了你定义的文档字段的类型analysis决定了对应的文档字段如何被搜索和解析对应的mapping{"user":{"mappings":{"_doc":{"properties":{"birthday":{"type":"date","format":"yyyy-MM-dd"},"description":{"type":"text","analyzer":"standard"},"mail":{"type":"keyword"},"nickname":{"type":"keyword"},"tag":{"type":"keyword"},"user_id":{"type":"integer"}}}}}}简单理解keyword和textkeyword支持精确搜索模糊搜索聚合查询不支持分词文本支持精确搜索模糊search分词搜索不支持聚合查询构建curlhttp后p://127.0.0.1:9200/user/_doc/_search//orphpsrc/all_search.php如果有返回数据说明构建成功查询文章查询性能过滤语句>查询语句然后是查询语句常用于全文搜索(简单理解就是需要使用分词搜索)过滤语句1.精确查询查询用户id为2的用户select*fromuserwhereuser_id=2对应es语法GET/user/_doc/_search{"query":{"term":{"user_id":2}}}对应demophpsrc/search1.php2。字符串查询查询邮箱为WcQT9YHGXb@mail.com的用户查询mysqlselect*fromuserwheremail='WcQT9YHGXb@mail.com'GET/user/_doc/_search{"query":{"term":{"mail":"WcQT9YHGXb@mail.com"}}}如果查询字符串中包含中文,请参见下面查询语句1对应的demophpsrc/search2.php3。按时间查询,查询出生日期>1994年11月30日的所有用户。Select*fromuserwherebirthday>'1994-11-30'GET/user/_doc/_search{"query":{"range":{"birthday":{"gt":"1994-11-30"}}}}对应demophpsrc/search3.phpgt:>gte:>=lt:clte:<=4。根据Range查询queryuserid在1到10范围内benchmarkmysqlqueryselect*fromuserwhereuser_idin(1,2,3,4,5,6,7,8,9,10)GET/user/_doc/_search{“查询”:{“条款”:{“user_id”:[1,2,3,4,5,6,7,8,9,10]}}}phpsrc/search4.php5.单标签查询查询标签中包含出轨男的所有用户。mysql查询不想做benchmarkup!如果业务涉及到标签查询,就别想用mysql来设计了!!GET/user/_doc/_search{"query":{"term":{"tag":"没心没肺的人"}}}phpsrc/search8.php查询语句1、精准查询中文字符串映射对应关键字查询用户A用户昵称洪二光selectmysqlqueryselect*fromuserwhererealname='洪二光'GET/user/_doc/_search{"query":{"match":{"nickname":"洪二光"}}}phpsrc/search5.php2。分词查询字符串映射对应文本查询用户描述机会R.M.Nixon相关的基准测试mysqlquerybenchmarkingballGET/user/_doc/_search{"query":{"match":{"description":"opportunityR.M.Nixon"}}}phpsrc/search6.php3.准确查询text对应的中文字符串映射(心里能用,真有这种场景就不要用,考虑是否定义为text)准确查询用户形容为Betteranopenenemythan一个虚假的朋友。对于基准mysql查询,select*fromuserwheredescription='Behonestratherclever.'可以尝试使用以上任意一种方法查询,发现没有返回结果如果映射定义了文本分词,又需要满足精确搜索,我们需要修改映射"description":{"type":"text","analyzer":"standard","fields":{"keyword":{"type":"keyword","ignore_above":256}}修改后设置两个字段,一个是倒排索引后的字段本身,一个是field.keyword(description.keyword),也就是word-默认不敏感。并保持最多ignore_above设置长度(字符)phpsrc/build_index2.php然后GET/user/_doc/_search{"query":{"term":{"description.keyword":"诚实而聪明。"}}}phpsrc/search7.php复合查询1.多标签查询所有标签同时包含无情男和宅男的用户GET/user/_doc/_search{"query":{"bool":{"must":[{"term":{"tag":"无情男"}},{"term":{"tag":"宅男"}}]}}}phpsrc/search9.php2.多标签或query查询标签所有包含无情男和宅男其中之一的用户GET/user/_doc/_search{"query":{"terms":{"tag":["Theheartlessman","The御宅族”]}}}phpsrc/search10.php3.OR查询查询邮箱是MGyY5VRs9r@mail.com还是WvJTELTX9d@mail.combenchmarkmysqlselect*fromuserwheremail='MGyY5VRs9r@mail.com'ormail='WvJTELTX9d@mail.com'GET/user/_doc/_search{“查询”:{“布尔”:{“应该”:[{“术语”:{“邮件”:“MGyY5VRs9r@mail.com”}},{"term":{"mail":"WvJTELTX9d@mail.com"}}]}}}phpsrc/search11.php4.复杂查询1查询用户ID从1到100且出生年份大于1994-11-30标签是无情男的用户GET/user/_doc/_search{"query":{"bool":{"must":[{"range":{"birthday":{"gt":"1994-11-30"}}},{"term":{"tag":"无情男"}},{"range":{"user_id":{"gte":1,"lte":100}}}]}}}phpsrc/search12.php5.复杂查询2查询ID在1到100之间或者200到400之间标签为无情男,简介词为life的用户,trustGET/user/_doc/_search{“查询”:{“布尔”:{“应该”:[{“范围”:{“user_id”:{"gte":1,"lte":100}}},{"range":{"user_id":{"gte":200,"lte":400}}}],"must":[{"term":{"tag":"HeartlessMan"}},{"match":{"description":"trustlife"}}]}}}phpsrc/search13.php到此结束,不是关于es20%,不过写demo写腻了(是的,就是腻了),还是自己摸索吧。最后,我会先学习如何使用Elasticsearch,再学习原理。后面的文章会包括如何建立索引和解析器自定义解析器,最后学习一些关于Elasticsearch的深层次的东西