java学习

java学习

 

2018年11月10日

elasticsearch 商品搜索信息的crud简单操作

课程大纲
1、document数据格式
2、电商网站商品管理案例:背景介绍
3、简单的集群管理
4、商品的CRUD操作(document CRUD操作)
----------------------------------------------------------------------------------------------------------------------------
1、document数据格式
面向文档的搜索分析引擎
(1)应用系统的数据结构都是面向对象的,复杂的
(2)对象数据存储到数据库中,只能拆解开来,变为扁平的多张表,每次查询的时候还得还原回对象格式,相当麻烦
(3)ES是面向文档的,文档中存储的数据结构,与面向对象的数据结构是一样的,基于这种文档数据结构,es可以提供复杂的索引,全文检索,分析聚合等功能
(4)es的document用json数据格式来表达
2、电商网站商品管理案例背景介绍
有一个电商网站,需要为其基于ES构建一个后台系统,提供以下功能:
(1)对商品信息进行CRUD(增删改查)操作
(2)执行简单的结构化查询
(3)可以执行简单的全文检索,以及复杂的phrase(短语)检索
(4)对于全文检索的结果,可以进行高亮显示
(5)对数据进行简单的聚合分析
----------------------------------------------------------------------------------------------------------------------------
3、简单的集群管理
(1)快速检查集群的健康状况
es提供了一套api,叫做cat api,可以查看es中各种各样的数据
GET /_cat/health?v
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488006741 15:12:21  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488007113 15:18:33  elasticsearch green           2         2      2   1    0    0        0             0                  -                100.0%
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1488007216 15:20:16  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
如何快速了解集群的健康状况?green、yellow、red?
green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了
为什么现在会处于一个yellow状态?
我们现在就一个笔记本电脑,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配5个primary shard和5个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。
做一个小实验:此时只要启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。
(2)快速查看集群中有哪些索引
GET /_cat/indices?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
(3)简单的索引操作
创建索引:PUT /test_index?pretty
health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   test_index XmS9DTAtSkSZSwWhhGEKkQ   5   1          0            0       650b           650b
yellow open   .kibana    rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
删除索引:DELETE /test_index?pretty
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
----------------------------------------------------------------------------------------------------------------------------
4、商品的CRUD操作
(1)新增商品:新增文档,建立索引
PUT /index/type/id
{
  "json数据"
}
PUT /ecommerce/product/1
{
    "name" : "gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}
PUT /ecommerce/product/2
{
    "name" : "jiajieshi yagao",
    "desc" :  "youxiao fangzhu",
    "price" :  25,
    "producer" :      "jiajieshi producer",
    "tags": [ "fangzhu" ]
}
PUT /ecommerce/product/3
{
    "name" : "zhonghua yagao",
    "desc" :  "caoben zhiwu",
    "price" :  40,
    "producer" :      "zhonghua producer",
    "tags": [ "qingxin" ]
}
es会自动建立index和type,不需要提前创建,而且es默认会对document每个field都建立倒排索引,让其可以被搜索
(2)查询商品:检索文档
GET /index/type/id
GET /ecommerce/product/1
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "name": "gaolujie yagao",
    "desc": "gaoxiao meibai",
    "price": 30,
    "producer": "gaolujie producer",
    "tags": [
      "meibai",
      "fangzhu"
    ]
  }
}
(3)修改商品:替换文档
PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao",
    "desc" :  "gaoxiao meibai",
    "price" :  30,
    "producer" :      "gaolujie producer",
    "tags": [ "meibai", "fangzhu" ]
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": true
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "created": false
}
PUT /ecommerce/product/1
{
    "name" : "jiaqiangban gaolujie yagao"
}
替换方式有一个不好,即使必须带上所有的field,才能去进行信息的修改
(4)修改商品:更新文档
POST /ecommerce/product/1/_update
{
  "doc": {
    "name": "jiaqiangban gaolujie yagao"
  }
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 8,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
我的风格,其实有选择的情况下,不太喜欢念ppt,或者照着文档做,或者直接粘贴写好的代码,尽量是纯手敲代码
(5)删除商品:删除文档
DELETE /ecommerce/product/1
{
  "found": true,
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "_version": 9,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  }
}
{
  "_index": "ecommerce",
  "_type": "product",
  "_id": "1",
  "found": false
}

posted @ 2018-11-10 18:31 杨军威 阅读(10) | 评论 (0)编辑 收藏

2018年8月9日

每个班的前10名的MySQL 查询方法

  1. select a.class,a.score
  2. from student a
  3. where (select count(*) from student where class=a.class and a.score<score)<3
  4. order by a.class,a.score desc;

posted @ 2018-08-09 14:32 杨军威 阅读(64) | 评论 (0)编辑 收藏

2018年7月4日

git ssl tls 报错需要执行的命令

 git config --global http.sslVerify false

posted @ 2018-07-04 15:27 杨军威 阅读(24) | 评论 (0)编辑 收藏

2018年6月8日

java值传递的例子

public class Test {
//不能正确调换值
public static void swap(Integer a,Integer b){
Integer t=a;
a=b;
b=t;
System.out.println("a="+a);
System.out.println("b="+b);
}
public static void main(String[] args) {
Integer a=1;
Integer b=2;
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("----------");
swap(a, b);
System.out.println("----------");
System.out.println("a="+a);
System.out.println("b="+b);
}
}
在内存中,真实的值放在heap中,变量a,b放在栈中,a,b保存的是值在heap中的地址,当调用swap方法时,形参也是保存在栈中,是新的变量,指向heap中真的值,并没有修改原先a,b的指向,所以无法交换值。

posted @ 2018-06-08 14:24 杨军威 阅读(34) | 评论 (0)编辑 收藏

2018年5月21日

spring中Condition接口的用法

matches方法返回true,装配bean,返回false,不装配bean,在需要可能装配的bean的方法和类上加上注解@Conditional(XXXCondition.class)

posted @ 2018-05-21 15:42 杨军威 阅读(24) | 评论 (0)编辑 收藏

spring中BeanPostProcessor接口的使用

@Component
public class AllBeanPostProcessor implements BeanPostProcessor{
//对象属性设置方法完成后,init方法执行前执行
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeforeInit="+beanName);
return bean;
}
//init方法执行后执行
public  Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("AfterInit="+beanName);
return bean;
}
}

posted @ 2018-05-21 10:04 杨军威 阅读(19) | 评论 (0)编辑 收藏

spring中BeanDefinitionRegistryPostProcessor接口的使用

@Component
public class MyBeanFactoryPostProcessor2 implements BeanDefinitionRegistryPostProcessor{
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
}
//可以动态把对象注入spring对象
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
for (int i = 0; i < 10; i++) {
BeanDefinitionBuilder b=BeanDefinitionBuilder.rootBeanDefinition(User.class);
b.addPropertyValue("name", "admin"+i);
registry.registerBeanDefinition("user"+i, b.getBeanDefinition());
}
}
}

posted @ 2018-05-21 10:03 杨军威 阅读(749) | 评论 (0)编辑 收藏

2018年5月3日

volatile

关键字
package test;
public class TestThread extends Thread{
private volatile boolean stop=false;
@Override
public void run() {
int i=0;
while(!stop){
i++;
}
System.out.println("完成="+i);
}
public void setStop(){
stop=true;
}
public boolean  getStop(){
return stop;
}
}
volatile关键字只能保证多个线程间的可见性,但是不具备同步性,可以算得上是轻量级的
synchronized,性能要比synchronized高,不会造成阻塞。一般volatile用于多个线程之间的可见的变量操作,并不能代替synchronized的同步功能。

posted @ 2018-05-03 09:56 杨军威 阅读(29) | 评论 (0)编辑 收藏

2018年5月2日

oracle一致性读

例如:9点的时候,客户A发起select语句,大概需要执行10分钟,返回结果100,在9点5分的时候,客户B发起一条update语句,把100更新为200.当10分钟后,客户A得到的结果还是100或者返回异常snapshot too old。因为oracle数据库有数据一致性的保证,客户9点查询时,数据库会把数据复制到undo的副本,给客户返回的就是这个副本,如果同时多个客户端进行update操作,可能导致副本找不到,但是无论如何,不会返回修改过的数值。

posted @ 2018-05-02 17:08 杨军威 阅读(49) | 评论 (0)编辑 收藏

java同步锁的使用3

在一个对象中的多个方法上都加上synchronized,代表同时执行这些方法时,是同步的,同步锁是属于对象的不是单个方法的。
package test;
public class Test6 {
public  synchronized void get1(String s){
System.out.println(s);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public  synchronized void get2(String s){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(s);
}
public static void main(String[] args) {
final Test6 t =new Test6();
new Thread(new Runnable() {
@Override
public void run() {
t.get1("a");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
t.get2("b");
}
}).start();
}
}

posted @ 2018-05-02 16:35 杨军威 阅读(28) | 评论 (0)编辑 收藏

仅列出标题  下一页

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜