ElasticSearch的概述及应用

206 阅读3分钟

Es全文检索引擎

Es的概述:随着时间的发展,常规的搜索已经很难满足人们的需要,像京东,百度,他们是怎么实现这些快速寻找的功能呢?答案是Es(特殊的全文搜索引擎)~

```全文检索引擎:其实就是将无结构的数据,通过全文检索引擎变成有结构的数据,从而实现高效率搜索

-   全文:针对所有文本,也就是我们存储到搜索服务器中的文本内容
-   检索:就是搜索的意思
-   引擎:可以认为是一个服务器,一个工具,我们可以使用这个工具达到我们想要的效果
这里我们要简单说一下他的底层,ES的底层就是使用了Lucene(基于Java开发的,全文检索引擎工具包),说到这里就不得不说一下他的黄金面试题了
Lucene原理:
      从索引的创建-1.给原始数据加索引(类似于下标的东西)
                       2.给原始数据进行分页(比如说helloworld=>hello world)给分隔开
                       3.原始数据进行小写及现代词改变(过去时等其他时态变成现在时,通俗点来说就是昨天的事情都拿来今天来做)
                       4.字母进行排序(这是为了让响应速度更快)
                       5.将所有的词进行去重并且合并索引,最终形成倒排索引文档(可以理解为key,value的交换位置)
      索引的搜索-1.对搜索的数据进行分词
                2.对分词的数据去去倒排索引中寻找
                3.根据索引值匹配原始数据
                4.计算出匹配的值的相关度进行排序响应
ES索引&文档操作
      索引-1.DELETE 索引库  删除索引
      文档-   1.GET /索引库/_doc/Id:查询单个文档
              2.GET /索引库/_doc/_search:查询所有文档
              3.PUT /索引库/_doc/Id  {jeson}:  添加id对应的索引
              4.POST /索引库/_doc  {json数据}:随即添加
              5.POST /索引库/_doc/id/_updat{"doc":{json数据}}:局部修改数据
              6.POST /索引库/_doc/id {json数据}覆盖并生成新数据
              7.DELETE /索引库/_doc/id删除指定文档
DSL语法的引入
目前DSL语法有两种形式
-   DSL查询:query DSL  模糊查询
-   DSL过滤:filter DSL   等值查询
DSL常用关键字
    1.query 查询
    2.bool 多个组合条件
    3.filter 过滤
    4.term 全值匹配,不会分词
    5.match 分词后进行匹配
    6.must DSL查询可以加多个条件
    7.from 从哪一条开始取,以数值的下一条数据开始
    8.size 每页展示条数
    9._source 只选择某些字段
    10.must_not 不包含
    11.range 匹配某个范围
    事列代码:
 GET /pethome/pet/_search  where sex = 1 and username like "%zs%"
 {
	"query": { // 编写DSL查询条件关键字
		"bool": { 		// 开启组合查询
			"must": [{	// 必须匹配
				"match": { // 分词后再进行查询
					"username": "zs"
				},
			}],
			"filter": { // DSL过滤
				"term": { // 等值查询
					"sex": 1
				}
			}
		}
	},
	"from": 20,
	"size": 10,
	"_source": ["name", "age", "username"],
	"sort": [{
		"age": "desc"
	}, {
		"id": "asc"
	}]
 }
文档类型映射:
为了方便字段的检索,我们会指定存储在ES中的字段是否进行分词,但是有些字段类型可以分词,有些字段类型不可以分词,所以对于字段的类型需要我们自己去指定
字符串 text-分词 keyword-不分词   StringField-不分词文本   TextFiled分词文本
数字   long       integer         short                      double          float
日期   date
逻辑   boolean 
复杂字段类型:
数组类型    array
地理位置    geo_point,geo_shape

添加映射   如果索引已经有数据了,那么不能再添加映射,添加映射之前必须先创建索引,可以先删除索引,再重新添加映射