Java_ElasticSearch(ES)——分布式搜索引擎

打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

介绍:

        Elasticsearch是一个开源的分布式搜索和分析引擎,最初由Elastic公司开发。它构建在Apache Lucene搜索引擎库之上,提供了一个强大的全文搜索和分析引擎, 它结合kibana、Logstash、Beats,是一整套技术栈,被叫做ELK,实用于各种用例,包括文本搜索、日志分析、实时数据分析、监控和报警等。

官网:

        官网地址:Elastic — The Search AI Company | Elastic,现在最新的版本是8.x.x,国内大多利用6.x.x和7.x.x。
优势:

        elasticsearch具备以下优势:
                ·支持分布式。可水平拓展
                ·提供Restful接口,可被任何语言调用
        es在处理海量数据搜索时,速度非常的快,是因为它底层采用倒排索引。
★倒排索引:

起首介绍一下正向索引

倒排索引

总结:


IK分词器:



        上述设置文件即表示添加扩展词典ext.dic,它就会在当前设置文件所在的目录中找这个文件。
总结:


基础概念:


与MySQL对比:


索引库操作

Mapping映射属性:


索引库操作:




总结:


文档处理:

CRUD:

新增:


查找、删除:


修改:

全量修改:


        这种方式在文档id不存在时,就会相当于一个新增操作。
增量修改:


批量处理:


JavaRestClient:


客户端初始化:


商品表Mapping映射:

        以商品表举例:

        在kibana中写出即为:
  1. PUT /items
  2. {
  3.   "mappings": {
  4.     "properties": {
  5.       "id": {
  6.         "type":"keyword"
  7.       },
  8.       "name":{
  9.         "type": "text",
  10.         "analyzer": "ik_smart"
  11.       },
  12.       "price":{
  13.         "type": "integer"
  14.       },
  15.       "image":{
  16.         "type": "keyword",
  17.         "index": false
  18.       },
  19.       "category":{
  20.         "type": "keyword"
  21.       },
  22.       "brand":{
  23.         "type": "keyword"
  24.       },
  25.       "sold":{
  26.         "type": "integer"
  27.       },
  28.       "comment_count":{
  29.         "type": "integer",
  30.         "index": false
  31.       },
  32.       "isAD":{
  33.         "type": "boolean"
  34.       },
  35.       "update_time":{
  36.         "type": "date"
  37.       }
  38. }
复制代码
索引库操作:

        创建索引库的JavaAPI与Restful接口API对比:


操作步调:


代码演示:

  1. class ItemTest {
  2.     private RestHighLevelClient client;
  3.     @BeforeEach
  4.     void setUp() {
  5.         // 初始化 RestHighLevelClient 对象
  6.         client = new RestHighLevelClient(RestClient.builder(
  7.                 HttpHost.create("http://192.168.178.130:9200")
  8.         ));
  9.     }
  10.     @AfterEach
  11.     void tearDown() throws IOException {
  12.         client.close();
  13.     }
  14.     @Test
  15.     void testCreateIndex() throws IOException {
  16.         //1.准备Request对象
  17.         CreateIndexRequest request = new CreateIndexRequest("items");
  18.         //2.准备请求参数
  19.         request.source(MAPPING_TEMPLATE, XContentType.JSON);
  20.         //3.发送请求
  21.         client.indices().create(request, RequestOptions.DEFAULT);
  22.     }
  23.     @Test
  24.     void testGetIndex() throws IOException {
  25.         //1.准备Request对象
  26.         GetIndexRequest request = new GetIndexRequest("items");
  27.         //2.发送请求
  28.         boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
  29.         System.out.println("exists: " + exists);
  30.     }
  31.     @Test
  32.     void testDeleteIndex() throws IOException {
  33.         //1.准备Request对象
  34.         DeleteIndexRequest request = new DeleteIndexRequest("items");
  35.         //2.发送请求
  36.         client.indices().delete(request, RequestOptions.DEFAULT);
  37.     }
  38.     private static final String MAPPING_TEMPLATE = "{\n" +
  39.             "  "mappings": {\n" +
  40.             "    "properties": {\n" +
  41.             "      "id": {\n" +
  42.             "        "type":"keyword"\n" +
  43.             "      },\n" +
  44.             "      "name":{\n" +
  45.             "        "type": "text",\n" +
  46.             "        "analyzer": "ik_smart"\n" +
  47.             "      },\n" +
  48.             "      "price":{\n" +
  49.             "        "type": "integer"\n" +
  50.             "      },\n" +
  51.             "      "image":{\n" +
  52.             "        "type": "keyword", \n" +
  53.             "        "index": false\n" +
  54.             "      },\n" +
  55.             "      "category":{\n" +
  56.             "        "type": "keyword"\n" +
  57.             "      },\n" +
  58.             "      "brand":{\n" +
  59.             "        "type": "keyword"\n" +
  60.             "      },\n" +
  61.             "      "sold":{\n" +
  62.             "        "type": "integer"\n" +
  63.             "      },\n" +
  64.             "      "comment_count":{\n" +
  65.             "        "type": "integer", \n" +
  66.             "        "index": false\n" +
  67.             "      },\n" +
  68.             "      "isAD":{\n" +
  69.             "        "type": "boolean"\n" +
  70.             "      },\n" +
  71.             "      "update_time":{\n" +
  72.             "        "type": "date"\n" +
  73.             "      }\n" +
  74.             "}\n" +
  75.             "}\n" +
  76.             "}";
  77. }
复制代码
文档操作:

新增文档:


运行代码:

  1. @SpringBootTest(properties = "spring.profiles.active=local")
  2. class ESDocTest {
  3.     private RestHighLevelClient client;
  4.     @Autowired
  5.     private IItemService itemService;
  6.     @BeforeEach
  7.     void setUp() {
  8.         // 初始化 RestHighLevelClient 对象
  9.         client = new RestHighLevelClient(RestClient.builder(
  10.                 HttpHost.create("http://192.168.178.130:9200")
  11.         ));
  12.     }
  13.     @AfterEach
  14.     void tearDown() throws IOException {
  15.         client.close();
  16.     }
  17.     @Test
  18.     void testIndexDoc() throws IOException {
  19.         //获取数据
  20.         Item item = itemService.getById(317578L);
  21.         ItemDoc itemDoc = BeanUtil.copyProperties(item, ItemDoc.class);
  22.         //创建request对象
  23.         IndexRequest request = new IndexRequest("item").id(itemDoc.getId());
  24.         //准备JSON文档
  25.         request.source(JSONUtil.toJsonStr(itemDoc), XContentType.JSON);
  26.         //发送请求
  27.         client.index(request, RequestOptions.DEFAULT);
  28.     }
  29. }
复制代码
删除文档:


查询文档:


修改文档:


全量更新:可以利用新增文档的代码,在得到ItemDoc后修改它的属性值在新增即可。
局部更新:

文档操作根本步调:


批处理:


代码示例:


DSL查询:



快速入门:


        注意:单次查询默认最大数据数为10000,最多返回10条数据
叶子查询:


全文检索:

        FIELD为要搜索的字段,TEXT为要搜索的内容

精确查询:


term查询一样平常用来搜不分词的字段,比如品牌等。如果搜分词的字段,VALUE只能写分好的词条,比如“脱脂”、“牛奶”等,才气搜到
range查询中gte和lte也可以写成gt和lt如许就是大于和小于。
ids查询:(批量查询id)

总结:


复合查询:


布尔查询:


示例:

        搜索“智能手机”,但品牌必须是华为,价格必须是900~1599
        

排序和分页:

排序:


示例:

        搜索商品,按照销量排序,销量一样则按照价格排序。
        

分页:


示例:

        搜索商品,查询出销量排名前10的商品,销量一样时按照价格升序。
        

深度分页问题:


解决方案:


高亮显示:


                                                                                              (↑标签默认就为em)
搜索完整语法:


JavaRestClient查询:

快速入门:



构建查询条件:


全文检索查询:


精确查询:


布尔查询:



排序和分页:


高亮显示:



聚合:

聚合的分类:


DSL实现聚合:




Java客户端实现聚合:

构造请求参数:

剖析结果:

       

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表