精华内容
下载资源
问答
  • 电商项目中es的使用

    2020-05-08 12:21:26
    电商项目中es的使用 es的搜索服务使用 1.完成关键字的搜索功能 2.完成商品分类过滤功能 3.完成品牌、规格过滤功能 4.完成价格区间过滤功能 使用高级客户端 1.关键字搜索,显示搜索结果 1.后端使用匹配查询和布尔查询 ...

    电商项目中es的使用
    es的搜索服务使用
    1.完成关键字的搜索功能
    2.完成商品分类过滤功能
    3.完成品牌、规格过滤功能
    4.完成价格区间过滤功能
    使用高级客户端
    1.关键字搜索,显示搜索结果
    1.后端使用匹配查询和布尔查询
    2.前端使用thymeleaf模版查询
    3.前端向后端传递map(为啥用map:因为提交的内容不仅仅是关键字,还有品牌、规格、分类等信息)
    4.后端向前端返回的map(返回的不仅仅是列表、还有商品分类、品牌等信息)

    2.商品分类的过滤
    是以关键字查询条件,查询结果中包含商品的分类
    点击商品的分类,按商品分类对结果进行过滤查询,并且在查询条件列表中添加已经选择的商品分类标签,隐藏搜索面板中的商品分类一行.
    点击条件标签的“x”,取消该过滤条件
    1.实现思路
    1.1商品分类列表的显示使用聚合查询
    1.2使用过滤查询
    3.品牌的过滤
    1.需求分析
    根据关键字搜索的到的商品分类列表,按照第一个分类查询下的品牌列表
    实现方法:
    1.数据访问层添加依赖,根据商品分类名称得到品牌列表
    2.在搜索商品的方法中,添加按品牌过滤的逻辑.

    展开全文
  • Android 3D开发,OpenGL ES 的使用(一)

    千次阅读 2017-03-09 00:56:52
    最近有人问OpenGL ES 的使用,我通过几行代码演示一下。 不需要讲 来源 历史或大篇前奏。。 通过短短的一段就能迅速理解OpenGL ES 初步使用方法,对OpenGL ES 有了大概的概念和感知。 和其他view的使用一样: ...

    最近有人问OpenGL ES 的使用,我通过几行代码演示一下。

    不需要讲 来源 历史或大篇前奏。。

    通过短短的一段就能迅速理解OpenGL ES 初步使用方法,对OpenGL ES 有了大概的概念和感知。

    和其他view的使用一样:

     

     <GLSurfaceView
            android:id="@+id/gl_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            GLSurfaceView glSurfaceView = (GLSurfaceView) findViewById(R.id.gl_view);
            glSurfaceView.setRenderer(new MyRender());
        }
    }
    

    是不是很简单。。。。setRenderer(); 就算完成了.

     

    发现了重点,所有的绘制都在MyRender() 这个类里。。。。先不急着讲MyRender(),分析一下OpenGL ES的使用步骤:

    ①创建GLSurfaceView组件,并使用Activity来显示。

    ②为GLSurfaceView组件创建一个MyRender实例,并实现GLSurfaceView.Renderer 接口的三个方法。

    public class MyRender implements GLSurfaceView.Renderer {

    }

    ③调用GLSurfaceView的setRenderer(new MyRender());方法。此Renderer对象将完成GLSurfaceView的3D图形绘制。

     

    实际的使用中,难点在Renderer类。下面讲一下Renderer的结构。

     

    import android.opengl.GLSurfaceView;
    import javax.microedition.khronos.egl.EGLConfig;
    import javax.microedition.khronos.opengles.GL10;
    
    /**
     * Created by Administrator on 2017/3/8.
     */
    public class MyRender implements GLSurfaceView.Renderer {
        /**
         * 当SurfaceView创建的时候,系统会回调这个方法
         * 该方法可以对SurfaceView执行一些无变化的初始化操作
         * @param gl10
         * @param eglConfig
         */
        @Override
        public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
            gl10.glDisable(GL10.GL_DITHER);//关闭抗抖动//禁用某些功能
            // 设置系统对透视进行修正 // 对某方面修正
            gl10.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
            gl10.glClearColor(0,0,0,0);// 设置清屏用的颜色,RGBA
            // 设置阴影为平滑模式
            gl10.glShadeModel(GL10.GL_SMOOTH);// 设置阴影模式
            // 启用深度测试即Z轴 //与glDisable相反,启用。
            gl10.glEnable(GL10.GL_DEPTH_TEST);
            // 设置深度测试的类型
            gl10.glDepthFunc(GL10.GL_LEQUAL);
        }
    
        /**
         * 此初始化为SurfaceView大小变化时初始化调用
         * 多用于3D场景初始化
         * @param gl10
         * @param width
         * @param height
         */
        @Override
        public void onSurfaceChanged(GL10 gl10, int width, int height) {
            gl10.glViewport(0, 0, width, height);//设置3D视窗的大小及位置
            gl10.glMatrixMode(GL10.GL_PROJECTION);//当前矩阵模式设置为投影矩阵
            gl10.glLoadIdentity();// 初始化单位矩阵
            float ratio =(float)width/height;//计算视窗的宽高比
            gl10.glFrustumf(-ratio,ratio,-1,1,1,0);//设置透视窗的空间大小
        }
    
        @Override
        public void onDrawFrame(GL10 gl10) {
            gl10.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);//清除屏幕缓存和深度缓存
            // 下面就开始用GL10绘制自己想要的图形了
            
        }
    }


    此时在回顾一下OpenGL ES的使用步骤:

     

     

    ①创建GLSurfaceView组件,并使用Activity来显示。

    ②为GLSurfaceView组件创建一个MyRender实例,并实现GLSurfaceView.Renderer 接口的三个方法。

    public class MyRender implements GLSurfaceView.Renderer {

    }

    ③调用GLSurfaceView的setRenderer(new MyRender());方法。此Renderer对象将完成GLSurfaceView的3D图形绘制。

    第二步应该就明白了。。。。

    实现GLSurfaceView.Renderer 接口然后实现它的三个方法。。两个初始化方法,一个绘制方法。

    初始化比如设置我们窗口打开是否启用Z轴,是否有边框,是否有阴影,每绘制一层都要清屏,我们用什么颜色清屏,窗口打开时的大小,窗口的某些功能是不是需要关闭等等。一系列的初始化设置。。。

    然后onDrawFrame方法开始根据设置好的坐标开始绘制图形了。。。

    绘制之前调用gl10.glClear 来清屏。然后再绘制。

    具体绘制下篇再写,绘制需要设置每个顶点的坐标和颜色值,接下来就是机械式的寻找各点坐标,设置各个点的 float[] 数组。

    3D图形 顶点多 坐标多,此篇理解了,下一步就是放坐标数据。。分开不容易乱。。。

    下一篇在onDrawFrame方法中加入坐标数据开始绘制。。


    熬夜写教程不容易,
    如果你欣赏我的代码,
    可以赞赏我几块钱买个新键盘。

     

    展开全文
  • 他人总结的es使用小结 给索引取别名,这样告诉使用者别名就ok了。 curl -XPOST 'http://172.18.1.22:9200/_aliases' -d { "actions" : [ { "add" : { "index" : "info-test" , "alias" : ...
    # encoding:utf8
    from datetime import datetime
    from elasticsearch import Elasticsearch
    import elasticsearch.helpers
    import random
    
    es = Elasticsearch(['172.18.1.22:9200', '172.18.1.23:9200', '172.18.1.24:9200', '172.18.1.25:9200', '172.18.1.26:9200'])
    
    
    es.indices.create(index='test_index', ignore=400)
    #es.index(index="skynet_social_twitter_v6", doc_type="test-type", id=42, body={"any": "data", "timestamp": datetime.now()})
    
    package = []
    for i in range( 10 ):
        row = {
            "@timestamp":datetime.now().strftime( "%Y-%m-%dT%H:%M:%S.000+0800" ),
            "count" : random.randint(  1, 100 )
        }
        package.append( row )
    
    actions = [
        {
            '_op_type': 'index',
            '_index': "test_index",  
            '_type': "test-type",  
            '_source': d
        }
        for d in package
    ]    
    
    elasticsearch.helpers.bulk( es, actions )

    他人博客总结的:他人总结的es使用小结

    给索引取别名,这样告诉使用者别名就ok了。

     curl -XPOST 'http://172.18.1.22:9200/_aliases' -d 
    {
        "actions": [
            {"add": {"index": "info-test", "alias": "wyl"}}
        ]
    }

    移除别名:

    curl -XPOST 'http://localhost:9200/_aliases' -d 
    {
        "actions": [
            {"remove": {"index": "test1", "alias": "alias1"}}
        ]
    }

    重命名一个别名就是一个简单的remove然后add的操作,也是使用相同的API。这个操作是原子的。

    重命名:

    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"remove": {"index": "test1", "alias": "alias1"}},
            {"add": {"index":"test1", "alias": "alias2"}}
        ]
    }'

    将一个别名同多个的索引关联起来:

    curl -XPOST 'http://localhost:9200/_aliases' -d '
    {
        "actions": [
            {"add": {"index": "test1", "alias":"alias1"}},
            {"add": {"index": "test2", "alias":"alias1"}}
        ]
    }'

    向一个指向多个索引的别名去索引数据会引发一个错误。

    1、查看集群的所有节点

    http://172.24.5.149:9200/_cat/nodes?v

    2、查看集群的健康情况

    http://172.24.5.149:9200/_cat/health?v

    3、查看集群中所有的索引

    http://172.24.5.149:9200/_cat/indices?v

    4、删除info-test索引

    curl -XDELETE 'http://172.24.5.149:9200/info-test'

    5、创建info-test索引

    curl -XPUT 'http://172.24.5.149:9200/info-test'
    

    6、向索引中插入一个ID为1的文档

        curl -XPUT "localhost:9200/info-test/people/1?
        {
            "name": "John Doe"
        }"
    

    7、在没有ID的情况下向索引中插入文档,ES会随机生成一个ID:

        curl -XPOST "localhost:9200/info-test/people?
        {
            "name": "John Doe"
         }"

    8、根据ID查询文档

     curl -XGET 'localhost:9200/info-test/people/1?

    9、更新ID为1的文档,将name字段的值改为Jane Doe

    curl -XPOST "localhost:9200/info-test/people/1/_update?
            {
              "doc": { "name": "Jane Doe" }
            }"

    10、更新ID为1的文档,将name字段的值改为Jane Doe,同时加上age字段

     curl -XPOST "localhost:9200/info-test/people/1/_update?
            {
              "doc": { "name": "Jane Doe", "age": 20 }
            }

    11、通过脚本来执行,给ID为1的文档的age属性值加5

     curl -XPOST "localhost:9200/info-test/people/1/_update?
            {
              "script" : "ctx._source.age += 5"
            }"
    在上面的例子中,ctx._source指向当前要被更新的文档。
    

    12、删除ID为2的文档

    curl -XDELETE "localhost:9200/info-test/people/2?"
    可以设置超时时间
    curl -XDELETE 'http://localhost:9200/twitter/tweet/1?timeout=5m'
    

    13、删除名字中包含“John”的所有文档

      curl -XDELETE "localhost:9200/info-test/people/_query?
            {
              "query": { "match": { "name": "John" } }
            }

    14、批量插入ID为1和ID为2的文档

     curl -XPOST 'localhost:9200/info-test/people/_bulk? {"index":{"_id":"1"}}{"name": "John Doe" }{"index":{"_id":"2"}}{"name": "Jane Doe" }'
    

    15、批量更新ID为1的文档,删除ID为2的文档

       curl -XPOST 'localhost:9200/customer/external/_bulk?
            {"update":{"_id":"1"}}
            {"doc": { "name": "John Doe becomes Jane Doe" } }
            {"delete":{"_id":"2"}}'

    16、搜索info-test索引中的所有文档

    curl 'localhost:9200/info-test/_search?q=*'

    17、使用POST请求体搜索info-test索引中的所有文档

          curl -XPOST 'localhost:9200/info-test/_search?
                {
                  "query": { "match_all": {} }
                }'

    18、使用POST请求体搜索info-test索引中的所有文档,但只要求返回一个文档(默认返回10个)

            curl -XPOST 'localhost:9200/info-test/_search?
                {
                  "query": { "match_all": {} },
            "size": 1
                }'

    19、使用POST请求体搜索info-test索引中的所有文档,返回第11到第20个文档

      curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": { "match_all": {} },
              "from": 10,
              "size": 10
            }'
    如果不指定from的值,它默认就是0。
    

    20、使用POST请求体搜索info-test索引中的所有文档并按照name属性降序排列

        curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": { "match_all": {} },
              "sort": { "name": { "order": "desc" } }
            }'

    21、使用POST请求体搜索info-test索引中的所有文档,但是只要求返回部分字段

       curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": { "match_all": {} },
              "_source": ["age", "name"]
            }'
    

    22、使用POST请求体搜索info-test索引中age属性值为20的文档

      curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": { "match": { "age": 20 } }
            }
    
    

    23、使用POST请求体搜索info-test索引中address属性值包含mill lane的文档.(Jane Doe相当于一个短语)

       curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": { "match_phrase": { "address": "mill lane" } }
            }'
    

    24、使用POST请求体搜索info-test索引中address属性值包含”mill”和”lane”的文档

         curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": {
                "bool": {
                  "must": [
                    { "match": { "address": "mill" } },
                    { "match": { "address": "lane" } }
                  ]
                }
              }
            }'
    must:and。 should: or。 must_not:非。

    25、使用POST请求体搜索info-test索引中balance的属性值在2000大于等于20000并且小于等于30000的文档

       curl -XPOST 'localhost:9200/info-test/_search?
            {
              "query": {
                "filtered": {
                  "query": { "match_all": {} },
                  "filter": {
                    "range": {
                      "balance": {
                        "gte": 20000,
                        "lte": 30000
                      }
                    }
                  }
                }
              }
            }'

    26、使用POST请求体搜索info-test索引中的文档,并按照state属性分组
    curl -XPOST ‘localhost:9200/info-test/_search?

     {
              "size": 0,
              "aggs": {
                "group_by_state": {
                  "terms": {
                    "field": "state"
                  }
                }
              }
            }'

    响应(其中一部分)是:

    "hits" : {
                "total" : 1000,
                "max_score" : 0.0,
                "hits" : [ ]
              },
              "aggregations" : {
                "group_by_state" : {
                  "buckets" : [ {
                    "key" : "al",
                    "doc_count" : 21
                  }, {
                    "key" : "tx",
                    "doc_count" : 17
                  }, {
                    "key" : "id",
                    "doc_count" : 15
                  }, {
                    "key" : "ma",
                    "doc_count" : 15
                  }, {
                    "key" : "md",
                    "doc_count" : 15
                  }, {
                    "key" : "pa",
                    "doc_count" : 15
                  }, {
                    "key" : "dc",
                    "doc_count" : 14
                  }, {
                    "key" : "me",
                    "doc_count" : 14
                  }, {
                    "key" : "mo",
                    "doc_count" : 14
                  }, {
                    "key" : "nd",
                    "doc_count" : 14
                  } ]
                }
              }
            }

    27、 在先前聚合的基础上,现在这个例子计算了每个州的账户的平均余额

    curl -XPOST 'localhost:9200/bank/_search?
            {
              "size": 0,
              "aggs": {
                "group_by_state": {
                  "terms": {
                    "field": "state"
                  },
                  "aggs": {
                    "average_balance": {
                      "avg": {
                        "field": "balance"
                      }
                    }
                  }
                }
              }
            }'

    28、基于前面的聚合,现在让我们按照平均余额进行排序:

      curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
            {
              "size": 0,
              "aggs": {
                "group_by_state": {
                  "terms": {
                    "field": "state",
                    "order": {
                      "average_balance": "desc"
                    }
                  },
                  "aggs": {
                    "average_balance": {
                      "avg": {
                        "field": "balance"
                      }
                    }
                  }
                }
              }
            }'

    29、使用年龄段(20-29,30-39,40-49)分组,然后在用性别分组,然后为每一个年龄段的每一个性别计算平均账户余额:

     curl -XPOST 'localhost:9200/bank/_search?pretty' -d '
            {
              "size": 0,
              "aggs": {
                "group_by_age": {
                  "range": {
                    "field": "age",
                    "ranges": [
                      {
                        "from": 20,
                        "to": 30
                      },
                      {
                        "from": 30,
                        "to": 40
                      },
                      {
                        "from": 40,
                        "to": 50
                      }
                    ]
                  },
                  "aggs": {
                    "group_by_gender": {
                      "terms": {
                        "field": "gender"
                      },
                      "aggs": {
                        "average_balance": {
                          "avg": {
                            "field": "balance"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }'

    30、给已有的mapping新增一个字段

    POST /information/_mapping/email1
    {
      "properties": {
        "name": {
          "type": "text",
          "index": "analyzed"
        }
      }
    }

    31、设置索引的setting

    PUT /atom/_settings
    {
      "settings": {
    
           "index.mapping.total_fields.limit": 4000
    
    },
      "index": {
        "refresh_interval": "30s",
        "number_of_replicas":"0"
      }
    }
    

    32、查看指定type的mapping(如果不指定type,则查看index下面所有type的mapping)

    GET /atom/_mapping/人类

    33、条件更新_update_by_query

    POST /index/type/_update_by_query?conflicts=proceed
    {
      "script": {
        "inline": "ctx._source.ontology_type=(params.tag)",
        "lang": "painless",
        "params": {
          "tag": "event"
        }
      },
      "query": {
        "match_all": {}
      }
    }

    34、查询某个type下面的所有数据

    POST /atom/欧洲排球锦标赛/_search
    {
      "query": {
        "match_all": {}
      }
    }

    35、创建文档的时候带版本号

    PUT twitter/tweet/1?version=2
    {
        "message" : "elasticsearch now has versioning support, double cool!"
    }

    version类型:internal、external or external_gt、external_gte

    36、创建文档的时候带op_type参数

    PUT twitter/tweet/1?op_type=create
    {
        "user" : "kimchy",
        "post_date" : "2011-11-15T14:12:12",
        "message" : "trying out Elasticsearch"
    }

    或者

    PUT twitter/tweet/1/_create
    {
        "user" : "kimchy",
        "post_date" : "2011-11-15T14:12:12",
        "message" : "trying out Elasticsearch"
    }

    37、创建文档的时候自动生成id字段

    POST twitter/tweet/
    {
        "user" : "kimchy",
        "post_date" : "2009-11-15T14:12:12",
        "message" : "trying out Elasticsearch"
    }

    38、创建文档的时候指定路由字段

    POST twitter/tweet?routing=kimchy
    {
        "user" : "kimchy",
        "post_date" : "2011-11-15T14:12:12",
        "message" : "trying out Elasticsearch"
    }

    39、创建文档时设置超时时间

    PUT twitter/tweet/1?timeout=5m
    {
        "user" : "kimchy",
        "post_date" : "2011-11-15T14:12:12",
        "message" : "trying out Elasticsearch"
    }

    40、查询时不要source字段

    GET twitter/tweet/0?_source=false

    41、查询时选择source中的字段

    GET twitter/tweet/0?_source_include=*.id&_source_exclude=entities

    或者

    GET twitter/tweet/0?_source=*.id,retweeted

    42、只获取source里面的字段

    GET twitter/tweet/1/_source

    也可以选择source里面的部分字段

    GET twitter/tweet/1/_source?_source_include=*.id&_source_exclude=entities'

    43、自定义routing

    GET twitter/tweet/2?routing=user1

    创建文档的时候指定了routing的话,查询时候也要带上routing

    44、给指定的type创建mapping

    POST /information/_mapping/email1
    {
      "properties": {
        "name": {
          "type": "text",
          "index": "analyzed"
        }
      }
    }

    45、delete_by_query

    POST atom_v3/news/_delete_by_query?conflicts=proceed
    {
      "query": { 
        "match": {
          "docType": "news"
        }
      }
    }

    46、强制合并索引的segment

    POST atom_v3/_forcemerge?max_num_segments=5

    47、查看某个索引的segments

    http://172.24.8.83:9200/atom_v3/_segments

    或者

    http://172.24.8.83:9200/_cat/segments/atom_v3

    48、创建索引的同时创建mapping

    PUT my_index
    {
      "mappings": {
        "user": {
          "_all": {
            "enabled": false
          },
          "properties": {
            "title": {
              "type": "text"
            },
            "name": {
              "type": "text"
            },
            "age": {
              "type": "integer"
            }
          }
        },
        "blogpost": {
          "_all": {
            "enabled": false
          },
          "properties": {
            "title": {
              "type": "text"
            },
            "body": {
              "type": "text"
            },
            "user_id": {
              "type": "keyword"
            },
            "created": {
              "type": "date",
              "format": "strict_date_optional_time||epoch_millis"
            }
          }
        }
      }
    }

    49、reindex:index之间的数据导入

    POST _reindex
    {
      "source": {
        "index": "twitter"
      },
      "dest": {
        "index": "new_twitter"
      }
    }
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,156
精华内容 12,462
关键字:

es的使用