ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式

您所在的位置:网站首页 文档搜索功能怎么用 ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式

ES(ElasticSearch)分布式全文搜索引擎介绍及使用方式

2023-12-16 04:56| 来源: 网络整理| 查看: 265

1.什么是ES **ES** 全称 **ElasticSearch** 是一种分布式全文搜索引擎,基于Lucene(全文搜索框架)开发而来。 Lucene是公认的迄今为止的最好用的搜索引擎库,但是他所提供的API对于我们使用者来说,是非常苦恼的,常要花费大量时间去熟悉学习。ES的出现就很好的解决了这个问题,良好的封装,易用的API,链式书写方式,开瓶即饮。 2.ES特点 **ES** 虽然是以Lucene核心库开发的,但是却不是以它作为核心,**ES** 的贴点体现在: *分布式实时文件存储,每个字段皆能索引* *集群,可扩展(理论上无上限)* *高度集成的服务(RESTful风格的API,各语言客户端)* *易学易用,开瓶即饮* 3.ES安装 3.1下载 [ES官方下载地址:](https://www.elastic.co/downloads/elasticsearch) ES安装环境只依赖JDK,以5.2.2版本为例,下载对应的文件即可 3.2安装 将压缩包解压,然后在解压后的目录下找到*bin*文件夹,点击名为**elasticsearch.bat** 文件运行。 测试是否安装成功:访问:http://localhost:9200/ ![安装成功:](https://img-blog.csdnimg.cn/2018110517350745.png) **注意**: 如果本机内存过小,或者磁盘空间不足会启动失败,手动修改*config*文件夹下**jvm.options**文件中的参数。 打开**jvm.options**文件,搜索-Xms,得到结果如下: ################################################################ ## IMPORTANT: JVM heap size ################################################################ ## ## You should always set the min and max JVM heap ## size to the same value. For example, to set ## the heap to 4 GB, set: ## ## -Xms4g ## -Xmx4g ## ## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html ## for more information ## ################################################################ # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space # '#'代表的是注释, -Xms 最小占用内存 -Xm最大占用内存 如果修改,默认启动时为2gb 这里可以修改一下 -Xms200m -Xmx200m 辅助管理工具Kibana5 这里介绍一款辅助学习工具,避免了使用cmd的尴尬场景 [Kibana5.2.2下载地址:](https://www.elastic.co/downloads/kibana) 解压并编辑config/kibana.yml,设置elasticsearch.url 的值为已启动的ES启动Kibana5 : bin\kibana.bat默认访问地址:http://localhost:5601菜单: Discover:可视化查询分析器 Visualize:统计分析图表 Dashboard:自定义主面板(添加图表) Timelion:Timelion是一个kibana时间序列展示组件(暂时不用) Dev Tools :Console(同CURL/POSTER,操作ES代码工具,代码提示,很方便) Management:管理索引库(index)、已保存的搜索和可视化结果(save objects)、设置 kibana 服务器属性 ES使用 ES数据管理 ES文档 ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。 ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。 ES存储的一个员工文档的格式示例: { _index : “crm”, _type : “user”,就 _id : 1, _source : { "email": "[email protected]", "name": "倪先华", "info": { "addr": "四川省成都市", "age": 30, "interests": [ "美食", "美女" ] }, "join_date": "2016-06-01" } } 尽管原始的 employee对象很复杂,但它的结构和对象的含义已经被完整的体现在JSON中了,在ES中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。 文档的必须三个节点: _index : “crm”, 文档存储位置(索引)_type : “user”,文档映射类型_id : 1,文档唯一标识(可以自定义也可以自动生成) ES文档的CRUD 以员工对象为例,,类比传统的数据库来看: 关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列ColumnElasticsearch -> 索引库Indices -> 类型Types -> 文档Documents -> 字段Fields

ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

//这里使用Kibana5编写的 # 创建crm PUT crm # 保存数据 POST crm/user/1 { "age" : 1, "name": "fq" } # 取值 (_source查看源数据) GET crm/user/1 //展示结果 { "_index": "crm", "_type": "user", "_id": "1", "_version": 3, "found": true, "_source": { "age": 1, "name": "fq" } } /* 这个API 似乎 允许你修改文档的局部,但事实上Elasticsearch 遵循与之前所说完全相同的过程,这个过程如下: 1. 从旧文档中检索JSON 2. 修改它 3. 删除旧文档 4. 索引新文档 */ # 存在修改,不存在创建(先删除在创建) POST crm/user/1 { "age" : 2, "name": "fqq" } # 取值(_source只看源数据) GET crm/user/1/_source //展示结果 { "age": 2, "name": "fqq" } # 删除文档 DELETE crm/user/1 //查询会查询不到,没有结果返回 # 获取所有文档 GET _search # 分页查询 /* 和SQL使用 LIMIT 关键字返回只有一页的结果一样,Elasticsearch接受 from 和 size 参数: size : 每页条数,默认 10 from : 跳过开始的结果数,默认 0 */ GET _search?size=5&from=10 DSL查询与过滤 概念 由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。

DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。

//查询字符串模式:同样是使用Kibana5 GET itsource/employee/_search?q=fullName:倪先华 DSL模式: GET itsource/employee/_search { "query" : { "match" : { "fullName" : "倪先华" } } } DSL查询

使用DSL查询,必须要传递query参数给ES。

GET _search {"query": YOUR_QUERY_HERE} # 实例一个完整查询 /* 查询公司员工性别为女的员工,并按照加入时间降序、年龄升序排列,最终返回第21条至30条数据(只返回名字、年龄和email字段) */ GET itsource/employee/_search { "query": { "match": {"sex":"女"} }, "from": 20, "size": 10, " _source": ["fullName", "age", "email"], "sort": [{"join_date": "desc"},{"age": "asc"}] } DSL过滤

DSL过滤语句和DSL查询语句非常相似,但是它们的使用目的却不同: DSL过滤查询文档的方式更像是对于我的条件“有”或者“没有”,而DSL查询语句则像是“有多像”。 DSL过滤和DSL查询在性能上的区别:

过滤结果可以缓存并应用到后续请求。查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。过滤语句可有效地配合查询语句完成文档过滤。

原则上,使用DSL查询做全文本搜索或其他需要进行相关性评分的场景,其它全用DSL过滤

使用方式 { "query": { "bool": { # 必须条件 "must": [ {"match": {"description": "search" }} ], # 过滤条件 "filter": { "term": {"tags": "lucene"} } } } } //① 全匹配(match_all) //普通搜索(匹配所有文档): { "query" : { "match_all" : {} } } //如果需要使用过滤条件(在所有文档中过滤,红色部分默认可不写): { "query" : { "bool" : { "must" : [{ "match_all":{} }], "filter":{....} } } } /*② 标准查询(match和multi_match) match查询是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。 如果你使用match查询一个全文本字段,它会在真正查询之前用分析器先分析查询字符:*/ { "query": { "match": { "fullName": "Steven King" } } } //上面的搜索会对Steven King分词,并找到包含Steven或King的文档,然后给出排序分值。 //如果用 match 下指定了一个确切值,在遇到数字,日期,布尔值或者 not_analyzed的字符串时,它将为你搜索你给定的值,如: { "match": { "age": 26 }} { "match": { "date": "2014-09-01" }} { "match": { "public": true }} { "match": { "tag": "full_text" }} //multi_match 查询允许你做 match查询的基础上同时搜索多个字段: { "query":{ "multi_match": { "query": "Steven King", "fields": [ "fullName", "title" ] } } } /*上面的搜索同时在fullName和title字段中匹配。 提示:match一般只用于全文字段的匹配与查询,一般不用于过滤。*/ //③单词搜索与过滤(Term和Terms) { "query": { "bool": { "must": { "match_all": {} }, "filter": { "term": { "tags": "elasticsearch" } } } } } //Terms搜索与过滤 { "query": { "terms": { "tags": ["jvm", "hadoop", "lucene"], "minimum_match": 2 } } } //minimum_match:至少匹配个数,默认为1 /*④ 组合条件搜索与过滤(Bool) 组合搜索bool可以组合多个查询条件为一个查询对象,查询条件包括must、should和must_not。 例如:查询爱好有美女,同时也有喜欢游戏或运动,且出生于1990-06-30及之后的人。*/ { "query": { "bool": { "must": [{"term": {"hobby": "美女"}}], "should": [{"term": {"hobby": "游戏"}},{"term": {"hobby": "运动"}}], "must_not": [{"range" :{"birth_date":{"lt": "1990-06-30"}}} ], "filter": [...], "minimum_should_match": 1 } } } //提示: 如果 bool 查询下没有must子句,那至少应该有一个should子句。但是 如果有 must子句,那么没有 should子句也可以进行查询。 /* ⑤ 范围查询与过滤(range) range过滤允许我们按照指定范围查找一批数据:*/ { "query":{ "range": { "age": { "gte": 20, "lt": 30 } } } } //上例中查询年龄大于等于20并且小于30。 //gt:> gte:>= lt:< lte: "bool": { "must": [{ "match_all": {} }], "filter": { "exists": { "field": "gps" } } } } } /*提示:exists和missing只能用于过滤结果。 ⑦ 前匹配搜索与过滤(prefix) 和term查询相似,前匹配搜索不是精确匹配,而是类似于SQL中的like ‘key%’*/ { "query": { "prefix": { "fullName": "倪" } } } //上例即查询姓倪的所有人。 /*⑧ 通配符搜索(wildcard) 使用*代表0~N个,使用?代表1个。*/ { "query": { "wildcard": { "fullName": "倪*华" } } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3