从非结构化的数据中把一部分信息提取出来,重新组织,使其变得有一定的结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。
1.索引的概念
从非结构化数据中提取出来的然后重新组织的信息称为索引。
2.全文检索
先建立索引,然后在对索引进行搜索的过程。
二、相关的概念1.索引库(相当于数据库中的表)
索引库就是存储索引的保存在磁盘上的一系列文件。 索引库相当于数据库中的一张表
2.document对象 (相当于表中的一条记录)
在索引前需要将原始内容创建成文档,文档中包括一个一个的域,域中存储内容,每个文档都有一个唯一的编号就是文档id
3.Field(相当于数据库中的字段)
field相当于数据库中的字段column ,数据类型可以分为数值类型和文本类型
一般需要查询的字段都是文本类型的,field还有如下属性
是否分词
是否对域的内容进行分词处理,前提是我们要对域的内容进行查询
是否索引
将field分析后的词或整个field进行索引,只有索引方可搜索到。
是否存储
将field值存储在文档中,存储在文档中的field才可以在document中获取.
4.term对象
从文档对象拆出来的每个单词叫做一个term,不同的域中拆分出来的相同的单词是不同的term. term是创建索引的关键词对象。
三、ElasticSearch简介ElasticSearch 简称 es, 是一个开源的高扩展的分布式全文检索引擎,可以近乎实时的存储、检索数据,
本身的扩展性很好,可以扩展到上百台服务器. 其目的是通过简单的Restful API来隐藏其Lucene的复杂性,从而使全文检索变得简单。
对应关系:
(关系型数据库)Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> documents -> Fields
核心概念:
索引(小写字母来定义)
一个索引就是一个拥有几分相似特征的文档的集合。
类型 type
在一个索引中,你可以定义一种或多种类型.一个类型是你的索引的一个逻辑上的分类、分区。
字段 field
对文档数据根据不同属性进行的分类表示
映射 mapping
mapping是处理数据的方式和规则方面做得一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等.
文档
一个文档是一个可被索引的基础信息单元,json格式
接近实时NRT
ElasticSearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟。
集群Cluster
一个集群就是由一个或多个节点组织在一起,他们共同持有整个的数据,并一起提供索引和搜索的功能,一个集群由一个唯一的名字表示,这个名字就是"elasticsearch".
8.节点node
一个节点是集群中的一个服务器。
9.分片和复制 shards&replicas
分片 : 允许你水平扩展你的内容容量
允许你在分片上进行分布式的、并行的操作、进而提高性能的吞吐量
复制:
当分片、节点失败的情况下、提供了高可用性,每个索引可以被分成多片,在elasticSearch中每一个索引有5个主分片和5个复制分片,原因是当服务器发生故障时,分片或节点可能会出于某种原因就消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的.
4.1 创建索引和映射
创建索引: PUT http://虚拟机地址:9200/索引名
创建映射 POST http://虚拟机地址:9200/索引名/映射名/_mapping
删除索引 DELETe http://虚拟机地址:9200/索引名
4.2 创建文档document
创建文档:POST http://虚拟机地址:9200/索引名/文档名
修改文档: POST http://虚拟机地址:9200/索引名/文档名
删除文档:DELETE http://虚拟机地址:9200/索引名/文档名
查询文档-->根据id查询:GET http://虚拟机地址:9200/索引名/文档名/id
查询文档(queryString查询): POST http://虚拟机地址:9200/索引名/文档名/_search
会把词进行拆解 分词查询
term 查询: POST http://虚拟机地址:9200/索引名/文档名/_search
不会吧词进行分解 是一个整体的词
IK分词器 (IK Analyzer)
两种模式 : ik_smart 粒度会粗一些
ik_max_word 粒度会更细一些
DSL语句使用
索引操作:
查询所有索引: GET /_cat/indices?v
删除某个索引 DELETE /索引名称
新增索引 PUT /索引名称
更新某个域:
POST /索引名/文档名/id/_update
{
"doc": {
......
}
}
删除document
DELETE /索引名/文档/id
查询所有数据
GET /user/_search
搜索排序:
GET /user/_search
{
"query": {
"match_all": {}
}
"sort": {
"字段名": {
"order": "desc" //降序 "asc" //增序
}
}
}
分页查询
GET /user/_search
{
"query": {
"match_all": {}
}
"sort": {
"字段名": {
"order": "desc" //降序 "asc" //增序
}
},
"from": 起始页,
"size": 每页查询的数据大小
}
查询模式:
(1) term查询
GET _search
{
"query": {
"term": {
"city": {
"value": "武汉"
}
}
}
}
(2) terms 查询
GET _search
{
"query": {
"terms": {
"字段名":[
"value1",
"value2"
]
}
}
}
(3) match查询
GET _search
{
"query": {
"match": {
"city": "武汉深圳"
}
}
}
(4) query_string 查询
GET _search
{
"query": {
"query_string": {
"default_field": "city",
"query": "武汉深圳"
}
}
}
#####
(5) range 查询 --> 范围查询
gt : > gte: >=
lt: < lte: <=
exists 可以过滤用于查找拥有某个域的数据
GET _search
{
"query": {
"exists": {
"field": "address"
}
}
}
(6) bool查询
must 相当于and
must_not 相当于not
should 相当于 or
GET _search
{
"query": {
"bool": {
"must": [
{
"term": {
"city": {
"value": "深圳"
}
}
},
{
"range": {
"age": {
"gte": 20,
"lte": 60
}
}
}
]
}
}
}
(7) match_all 查询
GET _search
{
"query": {
"match_all": {}
}
}
(8) match 查询 match查询是一个标准的查询
GET _search
{
"query": {
"match": {
"description": "武汉"
}
}
}
(9) Prefix 查询 以什么字符开头,可以更简单的使用prefix
GET _search
{
"query": {
"prefix": {
"name": {
"value": "赵"
}
}
}
}
(10) multi_match 查询
multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查一个
GET _search
{
"query": {
"multi_match": {
"query": "深圳",
"fields": [
"city",
"description"
]
}
}
}
Spring Data ElasticSearch
Spring Data ElasticSearch基于Spring data API 简化elasticsearch操作,将原始操作的客户端API进行封装。SpringData 为 ElasticSearch项目提供集成搜索引擎。SpringDataElasticSearch POJO的关键功能区域为中心的模型与ElasticcSearch几乎文档和轻松地编写一个存储库数据访问层



