ElasticSerach讲解

1.ElasticSerach定义: 
    ES=elasticsearch简写, 
    Elasticsearch是一个开源的高扩展的分布式全文检索引擎,
    它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。 
    Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,
    但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,
    从而让全文搜索变得简单。

2.ES和Lucene区别:
    1)Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,
    更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。

    2)Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,
    但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。

   ES和Solr区别

3.ES数据架构和Mysql对比
    Index ----  DataBase
    Type -----  Table
    Document--- Row

4.ES集群颜色
    绿色:健康,主分片和副分片都可用
    黄色:警告,主分片可用,没有副本分片
    红色:错误,主分片中部分索引已经不可使用,但是不影响其他分片正常使用

5.RESTfull 风格
    POST : 添加
    GET : 查询
    PUT : 修改 (没有此数据则添加数据,如果有则修改数据)
    DELETE: 删除
    
    运行head插件  在D:\ELK\elasticsearch-6.5.4\elasticsearch-head-master下cmd 运行 grunt server
    
    _index: 索引名称
    _type: 类型名称
    _id:数据的唯一id,id为自动生成
    _score: 分数,命中分数
    

6.文档索引的创建
    http://localhost:9200/book-002/jk-book/1/
    请求方法为 : POST

        {
		"_index": "book-002",   索引名称
		"_type": "jk-book",     类型名称
		"_id": "1",             唯一ID,如果指定了ID则使用指定的,没有指定ID则ES会自动补充ID
		"_version": 1,			数据版本号,新创建的数据从1开始,每次对数据修改则加1
		"result": "created",	created:创建成功,updated:修改成功
		"_shards": {
		"total": 2,
		"successful": 1,
		"failed": 0
		},
		"_seq_no": 0,
		"_primary_term": 1
		}

7.启动Kibana   在/bin/kibana.bat
    访问:http://localhost:5601
    启动Kibana后会在ES中创建一个名为.Kibana所以只有一个分片
    
8.kibana操作语法和命令
  

    GET _cat/health 查看当前索引状态

	GET _cat/indices 查看所有集群状态

	GET _search  查询所有内容
	{
	  "query": {
		"match_all": {
		}
	  }
	}

	查询指定索引和类型
	GET /book-002/jk-book/_search 
	{
	  "query": {
		"match_all": {
		}
	  }
	}

	添加数据
	POST /book-002/jk-book/3
	{
	  "id":3,
	  "name":"springCluod",
	  "author":"王听话",
	  "price":250,
	  "createTime":"2019-01-22"
	}

	修改数据
	PUT /book-002/jk-book/3
	{
	  "id":3,
	  "name":"springCluod",
	  "author":"王不听话",
	  "price":250,
	  "createTime":"2019-01-22"
	}

	删除数据
	DELETE /book-002/jk-book/4

	
	GET /book-002/jk-book/_search
	{
	  "query": {
		"match": {
		  "name": "ES6"  条查
		}
	  },
	  "highlight": {
		"fields": {
		  "name": {} 指定字段高亮 <em>内容</em>
		}
	  }
	}
	页面设置高亮
		em {
			font-style: normal;
			color: #c00;
		}
	

	区间查询 结合 bool使用
	GET /book-002/jk-book/_search
	{
	  "query": {
		"bool": { 
		  "must": [
			{
			  "match_all": {}
			}
		  ], 
		  "filter": {
			"range": {
			  "price": {
				"gte": 201, 大于等于
				"lte": 300  小于等于
			  }
			}
		  }
		}
	  }
	}
	
	短语搜索
	GET /book-002/jk-book/_search
	{
	  "query": {
		"match_phrase": {
		  "name": "大数据"
		}
	  }
	}

	sort 排序   from起始条数  size每页条数
	GET /book-002/jk-book/_search
	{
	  "query": {
		"match_all": {}
	  },
	  "sort": [
		{
		  "price": {  排序字段
			"order": "asc"
		  }
		}
	  ],
	  "from": 2,
	  "size": 2
	}

9.ES配置ik分词器,ik分词器官方已经提供好词汇
    将ik分词器的配置信息放入 在es目录/plugins/ik/  目录下
    注意ik目录需要手动创建
    
    ik_smart: 简单分词器方式,只能组成一次词汇进行分词
    ik_max_word: 深度分词器方式,将所有能组成的词汇进行分词
    standard:标准分词器、

    GET /_analyze?pretty
	{
	  "analyzer": "ik_smart",
	  "text": "我爱中国人民大会堂"
	}
	
	PUT /ik-index/

	DELETE /ik-index/

	POST /ik-index/ik-type/_mapping
	{
	  "properties": {
		"content":{
		  "type": "text",
		  "analyzer": "ik_max_word",
		  "store": true
		}
	  }
	}
	
	POST /ik-index/ik-type/_bulk
	{"index":{"_id":1}}
	{"content":"我爱电影"}
	{"index":{"_id":2}}
	{"content":"我爱你电影"}
	{"index":{"_id":3}}
	{"content":"我爱看电影"}

自定义词汇
        在ik目录下创建自定义词汇文件:文件名.dic
        在文件中添加词汇格式为:每行为一个词汇
        注意:更新后自定义词汇只会对之后的数据起作用
              在D:\ELK\elasticsearch-6.5.4\plugins\ik\config下
              配置扩展词汇IKAnalyzer.cfg.xml配置自定义文件(my_word.dic)
              <entry key="ext_dict">my_word.dic</entry>

    同义词:
        1.创建文件:在es目录/config/analysis/synonym.txt
        2.文件内容同义词汇为一行每个词汇用逗号分隔
        3.创建索引的时候指定同义词汇文件

        PUT /index-ik-006/
			{
				"settings": {
					"number_of_shards": 5, #指定分片数量
					"number_of_replicas": 1, #指定副本数量
					"analysis": { #自定义分词方式
						"analyzer": { #创建自自定义分词方式
							"ik_synonym": { #指定分词方式名称,会在映射属性的时候用到
								"type": "custom",
								"tokenizer": "ik_max_word", #指定同义词类型为ik_max_word
								"filter": [
									"my_synonym_filter" #找到同义词过滤器
								]
							}
						},
						"filter": { #配置分词过滤器
							"my_synonym_filter": {
								"type": "synonym", #指定类型为同义词 
								"synonyms_path": "analysis/synonym.txt" #指定同义词配置文件
							}
						}
					}
				}
			}

10.对属性添加映射

        POST /index-ik-006/test-ik/_mapping
			{
			  "properties": {
				"content":{
				  "type": "text",
				  "analyzer": "ik_synonym", #分词方式为自定义同义词方式,创建索引的时候有定义
				  "store": true
				},
				"price":{
				  "type": "double"
				}
			  }
			}

11.添加数据,搜索数据

            #给索引添加数据
			POST /index-ik-006/test-ik/100
			{
			  "content":"御帝哥哥",
			  "price":100
			}

			GET /index-ik-006/test-ik/_search
			{
			  "query": {
				"match": {
				  "content": "玄奘"
				}
			  },
			  "highlight": {
				"fields": {
				  "content": {}
				}
			  }
			}

12.五年高考,三年模拟
  同义词--》分词:
        
        西红柿-> 番茄,洋柿子,圣女果
        土豆->马铃薯,tudou,tu豆
        红薯->地瓜,番薯  
        5年---》五年 
        gaokao--》高考
        3nian  ---》 三年
        mo拟--》模拟
        
        
        
        
    spring整合es
        在yml文件中配置

spring:
 data:
  elasticsearch:
   repositories:
    enabled: true
   cluster-name: my-application
   cluster-nodes: localhost:93009300

// 第一种是 spring data封装的 ElasticsearchRepository

    @Autowired
    private UserDao userDao;

 // 第二种是 spring 封装 ElasticsearchTemplate

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

 

 @GetMapping("/selectUsers/{q}")
    public List<User> selectUsers(@PathVariable String q){
        List<User> userList = new ArrayList();
        // 获取ES操作的客户端
        Client client = elasticsearchTemplate.getClient();
        // 定义查询对象,指定索引名称和类型名称,也可以定义query查询
        SearchRequestBuilder searchRequestBuilder = client
                .prepareSearch("user-004")
                .setTypes("user-t")
                .setQuery(QueryBuilders.matchQuery("userName", q));
        // 获取高亮对象
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        // 设置高亮字段
        highlightBuilder.field("userName");
        // 将高亮对象放入查询对象中
        searchRequestBuilder.highlighter(highlightBuilder);
        // 获取查询返回的对象
        SearchResponse searchResponse = searchRequestBuilder.get();
        // 通过SearchResponse对象获取命中的结果集
        SearchHits hits = searchResponse.getHits();
        // 命中的结果集获取iterator迭代器
        Iterator<SearchHit> iterator = hits.iterator();
        while (iterator.hasNext()){
            User user = new User();
            SearchHit searchHit = iterator.next();
            Map<String, HighlightField> highlightMap = searchHit.getHighlightFields();
            HighlightField userName = highlightMap.get("userName");
            Map<String, Object> sourceAsMap = searchHit.getSourceAsMap();
            user.setUserId(sourceAsMap.get("userId").toString());
            user.setUserName(userName.getFragments()[0].toString());
            userList.add(user);
        }

        return userList;
    }
	
	
	
	@RequestMapping("/save")
    public String insertUser(){
        User user = new User();
        user.setUserId(UUID.randomUUID().toString());
        user.setUserName("小田");
        userDao.save(user);
        return "insert success";
    }

    @RequestMapping("/selectList")
    public List<User> selectUserList(){
        List<User> userList = new ArrayList();
        Iterable<User> iterable = userDao.findAll();
        Iterator<User> iterator = iterable.iterator();
        while (iterator.hasNext()){
            User user = iterator.next();
            userList.add(user);
        }
        return userList;
    }

    @GetMapping("/selectById/{id}")
    public User selectById(@PathVariable String id){
        User user = userDao.findById(id).get();
        return user;
    }

    @RequestMapping("/update")
    public String updateUser(){
        User user = new User();
        user.setUserId("d9894c6d-57ce-4ded-a601-1f62eba5674d");
        user.setUserName("小田");
        userDao.save(user);
        return "update success";
    }


    @RequestMapping("/delete/{id}")
    public String deleteUser(@PathVariable String id){
        userDao.deleteById(id);
        return "delete success";
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听风动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值