资讯详情

全文检索 Elasticearch教学

全文检索 Elasticearch 教学目标

  1. 了解Elasticsearch的应用场景
  2. 掌握索引维护的方法
  3. 掌握基本搜索Api的使用方法 约束 1.阅读本教程前需要掌握Lucene索引方法、搜索方法 。 1 ElasticSearch介绍 1.1 介绍

官方网址:https://www.elastic.co/cn/products/elasticsearch Github:https://github.com/elastic/elasticsearch 总结: 1、elasticsearch是一个基于Lucene支持开箱即用的高扩展分布式搜索服务器。 2、elasticsearch隐藏了Lucene外部提供的复杂性Restful 操作索引和搜索接口。 突出优点: 1.可扩展性好,可部署数百个服务器集群进行处理PB级数据。 2.近实时索引数据和搜索数据。 es和solr选择哪个? 1.如果你的公司现在使用它solr如果能满足需求,就不要换。 2.如果贵公司准备开发全文检索项目,建议优先考虑elasticsearch,因为像Github如此大规模的搜索都在使用它。 1.2原理与应用 1.2.1索引结构 下图是ElasticSearch索引结构,下黑部分是物理结构,上黄部分是逻辑结构,逻辑结构也是为了更好地描述ElasticSearch在物理结构中使用索引文件的工作原理。

逻辑结构部分是倒排索引表: 1要搜索的文档内容分词,所有不重复的短语组成分词列表。 2.最后,搜索文档Document存储方式。 3、每个词和docment都有关联。 如下: 现在,如果我们想搜索, quick brown ,我们只需要找到包含每个条目的文档:

两个文档都匹配,但第一个文档比第二个更匹配。如果我们使用简单的方法来计算匹配条目的数量 相似性算法 ,所以,我们可以说,第一个文档比第二个文档更适合我们查询的相关性。

1.2.3 RESTful应用方法 如何使用es? Elasticsearch提供 RESTful Api索引和搜索接口,并支持各种客户端。

下图是es应用方法:

1)用户在前端搜索关键字 2)项目前端通过http请求项目服务端 3)通过项目服务端Http RESTful方式请求ES搜索集群 4)ES从索引库中检索集群数据。 2 ElasticaSearch安装 2.1 安装

bin:脚本目录包括:可执行的脚本,如启动和停止  config:配置文件目录  data:索引目录,存储索引文件的地方  logs:日志目录  modules:包括模块目录es的功能模块  plugins :插件目录,es支持插件机制  2.2 配置文件  2.2.1 三个配置文件  ES配置文件的地址因安装形式而异:  使用zip、tar在安装目录中安装配置文件的地址confifig下。  使用RPM文件的安装和配置/etc/elasticsearch下。  使用MSI在安装目录中安装配置文件的地址confifig并将自动将下confifig目录地址写入环境变量 ES_PATH_CONF。 使用本教程zip包装安装,配置文件ES安装目录的confifig下。  配置文件如下:  elasticsearch.yml : 用于配置Elasticsearch运行参数 jvm.options : 用于配置Elasticsearch JVM设置  log4j2.properties: 用于配置Elasticsearch日志   2.2.2 elasticsearch.yml  配置格式是YAML,可采用以下两种方式:  方式1:层次方式  path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch  方式2:属性方式  path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch  本项目采用方法2,例子如下:  cluster.name: xuecheng  node.name: xc_node_1  network.host: 0.0.0.0  http.port: 9200  transport.tcp.port: 9300  node.master: true  node.data: true  #discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"] 
discovery.zen.minimum_master_nodes: 1 
bootstrap.memory_lock: false 
node.max_local_storage_nodes: 1 
path.data: D:\ElasticSearch\elasticsearch‐6.2.1\data 
path.logs: D:\ElasticSearch\elasticsearch‐6.2.1\logs 
http.cors.enabled: true 
http.cors.allow‐origin: /.*/ 
注意path.data和path.logs路径配置正确。 
常用的配置项如下: 
cluster.name:配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。 
node.name:节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,节点是物理概念,后边章节会详细介绍。 
path.conf: 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的confifig文件夹,rpm安装默认在/etc/elasticsearch path.data: 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开。 path.logs: 设置日志文件的存储路径,默认是es根目录下的logs文件夹 path.plugins: 设置插件的存放路径,默认是es根目录下的plugins文件夹 
bootstrap.memory_lock: true 设置为true可以住ES使用的内存,避免内存与swap分区交换数据。 
network.host: 设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。 http.port: 9200 设置对外服务的http端口,默认为9200。 
transport.tcp.port: 9300 集群结点之间通信端口node.master: 指定该节点是否有资格被选举成为master结点,默认是true,如果原来的master宕机会重新选举新的master。 node.data: 指定该节点是否存储索引数据,默认为true。discovery.zen.ping.unicast.hosts: ["host1:port", "host2:port", "..."] 设置集群中master节点的初始列表。 discovery.zen.ping.timeout: 3s 设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。 
discovery.zen.minimum_master_nodes:主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这里要设置为2。 
node.max_local_storage_nodes:单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1. 
2.2.3 jvm.options 
设置最小及最大的JVM堆内存大小: 
在jvm.options中设置 -Xms和-Xmx: 
1) 两个值设置为相等 
2) 将 Xmx 设置为不超过物理内存的一半。 
2.2.4 log4j2.properties 
日志文件设置,ES使用log4j,注意日志级别的配置。 
2.3 启动ES 
进入bin目录,在cmd下运行:elasticsearch.bat 
浏览器输入:http://localhost:9200 
显示结果如下(配置不同内容则不同)说明ES启动成功: 
3 ES快速入门 
ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用head插件来测试,目的是对ES的使用方法及流程有个初步的认识。 
3.1 创建索引库 
ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档。它就相当于MySQL中的表,或相当于Mongodb中的集合。 
关于索引这个语: 
索引(名词):ES是基于Lucene构建的一个搜索服务,它要从索引库搜索符合条件索引数据。 
索引(动词):索引库刚创建起来是空的,将数据添加到索引库的过程称为索引。 
下边介绍两种创建索引库的方法,它们的工作原理是相同的,都是客户端向ES服务发送命令。 
1)使用postman或curl这样的工具创建: 
put http://localhost:9200/索引库名称
{ 
       
	"settings": { 
       
		"index": { 
       
			"number_of_shards": 1,
			"number_of_replicas": 0
		}
	}
}
number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同 的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。 
number_of_replicas:设置副本的数量,设置副本是为了提高ES的高可靠性,单机环境设置为0. 
如下是创建的例子,创建xc_course索引库,共1个分片,0个副本:


3.2 创建映射
3.2.1 概念说明 
在索引中每个文档都包括了一个或多个field,创建映射就是向索引库中创建field的过程,下边是document和field与关系数据库的概念的类比: 
文档(Document)----------------Row记录 
字段(Field)-------------------Columns 列 
注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES官方将在ES9.0版本中彻底删除type。
上边讲的创建索引库相当于关系数据库中的数据库还是表? 
1、如果相当于数据库就表示一个索引库可以创建很多不同类型的文档,这在ES中也是允许的。 
2、如果相当于表就表示一个索引库只能存储相同类型的文档,ES官方建议 在一个索引库中只存储相同类型的文档。
3.2.2 创建映射 
我们要把课程信息存储到ES中,这里我们创建课程信息的映射,先来一个简单的映射,如下: 
发送:post http://localhost:9200/索引库名称/类型名称/_mapping 
创建类型为xc_course的映射,共包括三个字段:name、description、studymondel 
由于ES6.0版本还没有将type彻底删除,所以暂时把type起一个没有特殊意义的名字。 
post 请求:http://localhost:9200/my_course/doc/_mapping 
表示:在xc_course索引库下的doc类型下创建映射。doc是类型名,可以自定义,在ES6.0中要弱化类型的概念, 给它起一个没有具体业务意义的名称。 
{ 
       
	"properties": { 
       
		"name": { 
       
			"type": "text"
		},
		"description": { 
       
			"type": "text"
		},
		"studymodel": { 
       
			"type": "keyword"
		}
	}
}

映射创建成功在kibon中查询
3.3 创建文档 
ES中的文档相当于MySQL数据库表中的记录。 
发送:put 或Post http://localhost:9200/xc_course/doc/id值 
(如果不指定id值ES会自动生成ID) 
http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000 
{ 
       
	"name": "Bootstrap开发框架",
	"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。此开发框架包 含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的 精美界面效果。",
	"studymodel": "201001"
}

使用postman测试:

查询数据

3.4 搜索文档 
1、根据课程id查询文档 
发送:get http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000 
使用postman测试:

2、查询所有记录 
发送 get http://localhost:9200/xc_course/doc/_search 
3、查询名称中包括spring 关键字的的记录 
发送:get http://localhost:9200/xc_course/doc/_search?q=name:bootstrap 
4、查询学习模式为201001的记录 
发送 get http://localhost:9200/xc_course/doc/_search?q=studymodel:201001 
3.4.1查询结果分析 
分析上边查询结果: 
{ 
       
	"took": 1,
	"timed_out": false,
	"_shards": { 
       
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": { 
       
		"total": 1,
		"max_score": 0.2876821,
		"hits": [{ 
       
			"_index": "xc_course",
			"_type": "doc",
			"_id": "4028e58161bcf7f40161bcf8b77c0000",
			"_score": 0.2876821,
			"_source": { 
       
				"name": "Bootstrap开发框架",
				"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较 为广泛。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现 一个不受浏览器限制的精美界面效果。",
				"studymodel": "201001"
			}
		}]
	}
}

took:本次操作花费的时间,单位为毫秒。 
timed_out:请求是否超时 
_shards:说明本次操作共搜索了哪些分片 
hits:搜索命中的记录 
hits.total : 符合条件的文档总数 hits.hits :匹配度较高的前N个文档 
hits.max_score:文档匹配得分,这里为最高分 
_score:每个文档都有一个匹配度得分,按照降序排列。 
_source:显示了文档的原始内容。 
4 IK分词器 
4.1测试分词器 
在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终找到词关联的文档。 
测试当前索引库使用的分词器: 
post 发送:localhost:9200/_analyze 
{ 
       "text":"测试分词器,后边是测试内容:spring cloud实战"} 
结果如下:

会发现分词的效果将 “测试” 这个词拆分成两个单字“测”和“试”,这是因为当前索引库使用的分词器对中文就是单字分词。 
4.2 安装IK分词器 
测试分词效果: 
发送:post localhost:9200/_analyze 
{ 
       "text":"测试分词器,后边是测试内容:spring cloud实战","analyzer":"ik_max_word" } 

4.3 两种分词模式 
ik分词器有两种分词模式:ik_max_word和ik_smart模式。 
1、ik_max_word 
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、 华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。 
2、ik_smart 
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。 
测试两种分词模式:
发送:post localhost:9200/_analyze 
{ 
       "text":"中华人民共和国人民大会堂","analyzer":"ik_smart" } 
4.4 自定义词库 
如果要让分词器支持一些专有词语,可以自定义词库。 
5 映射 
上边章节安装了ik分词器,如果在索引和搜索时去使用ik分词器呢?如何指定其它类型的fifield,比如日期类型、数值类型等。 
本章节学习各种映射类型及映射维护方法。 
5.1 映射维护方法 
1、查询所有索引的映射: 
GET: http://localhost:9200/_mapping 
2、创建映射 
post 请求:http://localhost:9200/xc_course/doc/_mapping
一个例子:
{ 
       
	"properties": { 
       
		"name": { 
       
			"type": "text"
		},
		"description": { 
       
			"type": "text"
		},
		"studymodel": { 
       
			"type": "keyword"
		}
	}
}
3、更新映射 
映射创建成功可以添加新字段,已有字段不允许更新。 
4、删除映射 
通过删除索引来删除映射。 
5.2 常用映射类型 
5.2.1 text文本字段 
下图是ES6.2核心的字段类型如下:

字符串包括text和keyword两种类型: 
1、text 
1)analyzer 
通过analyzer属性指定分词器。 
下边指定name的字段类型为text,使用ik分词器的ik_max_word分词模式。 
"name": { 
       
	"type": "text",
	"analyzer": "ik_max_word"
}

上边指定了analyzer是指在索引和搜索都使用ik_max_word,如果单独想定义搜索时使用的分词器则可以通过 search_analyzer属性。 
对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。 
"name": { 
       
	"type": "text",
	"analyzer": "ik_max_word",
	"search_analyzer": "ik_smart"
}
2)index 
通过index属性指定是否索引。 
默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。 
但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置为false。 
删除索引,重新创建映射,将pic的index设置为false,尝试根据pic去搜索,结果搜索不到数据 
"pic": { 
        
"type": "text", 
"index":false 
} 
5.2.1.1 测试 
删除xc_course/doc下的映射 
创建新映射:Post http://localhost:9200/xc_course/doc/_mapping

{ 
       
	"properties": { 
       
		"name": { 
       
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"description": { 
       
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"pic": { 
       
			"type": "text",
			"index": false
		},
		"studymodel": { 
       
			"type": "text"
		}
	}
}

插入文档: 
http://localhost:9200/xc_course/doc/4028e58161bcf7f40161bcf8b77c0000
{ 
       
	"name": "Bootstrap开发框架",
	"description": "Bootstrap是由Twitter推出的一个前台页面开发框架,在行业之中使用较为广泛。此开发框架包 含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的 精美界面效果。",
	"pic": "group1/M00/00/01/wKhlQFqO4MmAOP53AAAcwDwm6SU490.jpg",
	"studymodel": "201002"
}
查询测试: 
Get http://localhost:9200/xc_course/_search?q=name:开发 
Get http://localhost:9200/xc_course/_search?q=description:开发 
Get http://localhost:9200/xc_course/_search? 
q=pic:group1/M00/00/01/wKhlQFqO4MmAOP53AAAcwDwm6SU490.jpg 

Get http://localhost:9200/xc_course/_search?q=studymodel:201002 
通过测试发现:name和description都支持全文检索,pic不可作为查询条件。 

5.2.2 keyword关键字字段
上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段的索引时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。 
5.2.2.1测试 
更改映射: 
{ 
       
	"properties": { 
       
		"studymodel": { 
       
			"type": "keyword"
		},
		"name": { 
       
			"type": "keyword"
		}
	}
}
插入文档: 
{ 
       
"name": "java编程基础", 
"description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。", 
"pic":"group1/M00/00/01/wKhlQFqO4MmAOP53AAAcwDwm6SU490.jpg", 
"studymodel": "201001" 
} 

根据studymodel查询文档 
搜索:http://localhost:9200/xc_course/_search?q=name:java 
name是keyword类型,所以查询方式是精确查询。 
5.2.3 date日期类型 
日期类型不用设置分词器。 
通常日期类型的字段用于排序。 
1)format 
通过format设置日期格式 
例子: 
下边的设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。
{ 
       
	"properties": { 
       
		"timestamp": { 
       
			"type": "date",
			"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
		}
	}
}
插入文档: 
Post :http://localhost:9200/xc_course/doc/3 
{ 
       
"name": "spring开发基础", 
"description": "spring 在java领域非常流行,java程序员都在用。", 
"studymodel": "201001", 
"pic":"group1/M00/00/01/wKhlQFqO4MmAOP53AAAcwDwm6SU490.jpg", 
"timestamp":"2018‐07‐04 18:28:58" 
} 
6.2.4 数值类型 
下边是ES支持的数值类型

1、尽量选择范围小的类型,提高搜索效率 
2、对于浮点数尽量用比例因子,比如一个价格字段,单位为元,我们将比例因子设置为100这在ES中会按 分 存 储,映射如下:
"price": { 
        
"type": "scaled_float", 
"scaling_factor": 100 
}, 
由于比例因子为100,如果我们输入的价格是23.45则ES中会将23.45乘以100存储在ES中。 
如果输入的价格是23.456,ES会将23.456乘以100再取一个接近原始值的数,得出2346。 
使用比例因子的好处是整型比浮点型更易压缩,节省磁盘空间。 
如果比例因子不适合,则从下表选择范围小的去用:

更新已有映射,并插入文档: 
http://localhost:9200/xc_course/doc/3 
{ 
       
"name": "spring开发基础", 
"description": "spring 在java领域非常流行,java程序员都在用。", 
"studymodel": "201001", 
"pic":"group1/M00/00/01/wKhlQFqO4MmAOP53AAAcwDwm6SU490.jpg", 
"timestamp":"2018‐07‐04 18:28:58", 
"price":38.6 
} 
6.2.5 综合例子 
创建如下映射 
post:http://localhost:9200/xc_course/doc/_mapping 
{ 
       
	"properties": { 
       
		"description": { 
       
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"name": { 
       
			"type": "text",
			"analyzer": "ik_max_word",
			"search_analyzer": "ik_smart"
		},
		"pic": { 
       
			"type": "text",
			"index": false
		},
		"price": { 
       
			"type": "float"
		},
		"studymodel": { 
       
			"type": "keyword"
		},
		"timestamp": { 
       
			"type": "date",
			"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd"
		}
	}
}
插入文档:
Post: http://localhost:9200/xc_course/doc/1
{ 
       
	"name": "Bootstrap开发",
	"description": "Bootstrap是由Twitter 推出的一个前台页面开发框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量 的CSS、JS程序代码,可以帮助开发者(尤其是不擅长页面开发的程序人员)轻松的实现一个不受浏览器限制的精 美界面效果。",
	"studymodel": "201002",
	"price": 38.6,
	"timestamp": "2018-04-25 19:11:35",
	"pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg"
}

6索引管理 
6.1 搭建工程 
6.1.1 ES客户端 
ES提供多种不同的客户端: 
1、TransportClient 
ES提供的传统客户端,官方计划8.0版本删除此客户端。 
2、RestClient 
RestClient是官方推荐使用的,它包括两种:Java Low Level REST Client和 Java High Level REST Client。 
ES在6.0之后提供 Java High Level REST Client, 两种客户端官方更推荐使用 Java High Level REST Client,不过当 
前它还处于完善中,有些功能还没有。 
本教程准备采用 Java High Level REST Client,如果它有不支持的功能,则使用Java Low Level REST Client。 
添加依赖: 
6.1.2 创建搜索工程 
创建搜索工程(maven工程):xc-service-search,添加RestHighLevelClient依赖及junit依赖。 
pom.xml 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    < 

标签: 单项电阻型流固态调压

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台