Elastic Search一些用法

这篇具有很好参考价值的文章主要介绍了Elastic Search一些用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、滚动查询

参考: 中国开源社区

  /**
     * 滚动查询, 并批量保存
     *
     * @param indexName
     * @return
     */
    public int scrollIndexName(String indexName) {
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        NativeSearchQuery searchQuery = nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery()).build();
        // 滚动一次数据量为1w
        searchQuery.setMaxResults(10000);
        // 第一次查询
        SearchScrollHits<RawDocDO> searchScrollHits = elasticsearchRestTemplate.searchScrollStart(60000, searchQuery, RawDocDO.class, IndexCoordinates.of(indexName));
        String scrollId = searchScrollHits.getScrollId();
        List<RawDocDO> rawDocDOList = new ArrayList<>();
        for (SearchHit<RawDocDO> searchHit : searchScrollHits.getSearchHits()) {
            RawDocDO content = searchHit.getContent();
            rawDocDOList.add(content);
        }
        String replace = indexName.replace("index", "latest");
        // 创建索引结构
        createIndex(replace, indexName.substring(6, 8));
        // 批量插入数据
        bulkIndexName(rawDocDOList, replace);
        // 批量创建总数
        int count = rawDocDOList.size();
        Long temp = searchScrollHits.getTotalHits();
        temp -= 10000;
        List<String> scrollIdList = new ArrayList<>();
        scrollIdList.add(scrollId);
        // 循环滚动插入
        while (temp > 0) {
            // 继续滚动
            searchScrollHits = elasticsearchRestTemplate.searchScrollContinue(scrollId, 60000, RawDocDO.class, IndexCoordinates.of(indexName));
            List<RawDocDO> rawDocDOList2 = new ArrayList<>();
            for (SearchHit<RawDocDO> searchHit : searchScrollHits.getSearchHits()) {
                RawDocDO content = searchHit.getContent();
                rawDocDOList2.add(content);
            }
            // 批量插入数据
            bulkIndexName(rawDocDOList2, replace);
            // 累加
            count += rawDocDOList2.size();
            scrollId = searchScrollHits.getScrollId();
            temp -= 10000;
        }

        logger.info("批量插入{}条数据到{}索引中", rawDocDOList.size(), replace);
        scrollIdList.add(scrollId);
        // 清除 scroll
        elasticsearchRestTemplate.searchScrollClear(scrollIdList);
        return count;
    }

二、设置权重

  • 官方介绍
  • ES 的权重排序
  • 【Elasticsearch】ElasticSearch 7.8 多字段权重排序

三、动态模板

1、基本概念

  • ElasticSearch7.3学习(十三)----定制动态映射(dynamic mapping)
  • 【Elasticsearch教程4】Mapping 动态映射
  • 【Elasticsearch教程5】Mapping 动态模板 Dynamic templates

2、原生创建动态模板

#删除已有index
DELETE my_index
# 创建dynamic_templates,以is开头的被识别为boolean类型,string类型匹配为keyword类型
PUT my_index
{
  "mappings": {
    "dynamic_templates": [
            {
        "strings_as_boolean": {
          "match_mapping_type":   "string",
          "match":"is*",
          "mapping": {
            "type": "boolean"
          }
        }
      },
      {
        "strings_as_keywords": {
          "match_mapping_type":   "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

3、ElasticSearch-data整合springboot创建

注意事项:需要先创建模板,然后添加数据,新增的数据则会按照模板的格式来创建。如果直接设置了索引的mapping,则模板映射会失效,模板是用户添加数据时候自动给属性添加映射类型。

  • 在resource目录下新建template-mapping.json
{
  "dynamic_templates": [
    {
      "content": {
        "match": "content",
        "mapping": {
          "analyzer": "standard",
          "search_analyzer": "english"
        }
      }
    },
    {
      "title": {
        "match": "title",
        "mapping": {
          "analyzer": "standard",
          "search_analyzer": "english"
        }
      }
    },
    {
      "summary": {
        "match": "summary",
        "mapping": {
          "analyzer": "standard",
          "search_analyzer": "english"
        }
      }
    }
  ]
}


  • 定义实体对象
package com.tmxbase.psas.dal.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;

import java.io.Serializable;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "#{@esAttribute.indexName}", replicas = 0, shards = 5)
//@Mapping(mappingPath = "/raw-doc-mapping.json")
//@DynamicTemplates(mappingPath = "/raw-doc-templates.json")
@Setting(settingPath = "/rawDoc-setting.json")
public class RawDocDO implements Serializable {
    // 字段
    public static final String ENTRY_ID_FIELD = "_id";

    @Id
    private String docId; // 数据id
    @Field(type =  FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
    private String summary; // 文章摘要
    @Field(type =  FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
    private String content; // 文章内容
    @Field(type =  FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
    private String title; //  文章标题
    @Field(type = FieldType.Keyword)
    private String media; // 媒体类型
    @Field(type = FieldType.Byte)
    private byte emotion; //  文章情感类型 positive=3 neutral=2 negative=1
    private String lan; // 文章所属语言
    @Field(type = FieldType.Keyword, index = false)
    private String href; // 文章来源页
    @Field(type = FieldType.Keyword)
    private String country; // 文章来源国家
    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    private String time; // 文章发布时间
}

四、分词器

  • Lucene中常用的几个分词器
  • ES之分词以及各大分词器
  • ES-文本分析(analysis)
  • Elasticsearch分词器简介与使用(一)

1、内置的分词器

(1)ES的内置分词器如下:

分词器 描述
Standard Analyzer ES的标准分词器,主要用于英文分词
Simple Analyzer 简单分词器,按非英文字母进行分词,同时转化成小写字母
Whitespace Analyzer 空格分词器,按空格分词
Stop Analyzer 类似于Simple Analyzer,但是增加了停顿词功能
Keyword Analyzer 关键词分词器
Pattern Analyzer 正则分词器,支持停顿词
Language Analyzer 针对特定语言的分词器
Fingerprint Analyzer 指纹分词器,通过创建标记进行重复检测

内置的分词器一般用于简单的测试,或者简单常规要求的英文文档索引。

(2)内置分词器设置禁用词

  • 在elasticSearch配置文件config目录下,添加stopWord.txt文件。
  • 在添加索引setting时候,加入配置
    es 设置分词的权重,Elastic Search,elasticsearch

2、IK分词器使用

ES如果需要索引中文内容,则使用最多的分词器就是IK分词器了。github地址:https://github.com/medcl/elasticsearch-analysis-ik

IK_smart设置禁用词

es 设置分词的权重,Elastic Search,elasticsearch

ik分词器设置禁用词与默认的分词器设置有所不同。

  • 在 elasticsearch-7.x.x\plugins\ik\config\ 目录下,打开目录可以看到有 stopword.dicextra_stopword.dic 两个文件。stopword.dic 里面的为配置的英文停用词,extra_stopword.dic 里面为配置的中文停用词。

  • 默认是使用 stopword.dic 的,想要使用 extra_stopword.dic 的话是需要在 ik 中进行配置的,配置文件为 IKAnalyzer.cfg.xml
    es 设置分词的权重,Elastic Search,elasticsearch

(3) 配置完成后重启 elasticsearch,就可以发现停用词已经不再对搜索产生影响了。

3、 安装其他分词器

安装越南语分词器

五、路由Routing

代写…

六、聚合分组查询

待写…

七、动态的为ElasticSearch的@Document指定index

1.在配置文件里设置indexName(只能设置一个indexName)

创建配置Bean:

@Component("esAttribute")
// 指定配置文件
@PropertySource("classpath:application.properties")
public class EsAttribute {
    @Value("${index.name}")
    private String indexName;

    public String getIndexName() {
        return indexName;
    }

    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }
}

在application.properties中添加:

index.name=tomcat1-*

在ElasticSearch返回的类型中使用:

@Data
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "#{@esAttribute.indexName}", shards = 1, replicas = 0,createIndex = true)
public class AppLogBean implements Serializable {
	
	private static final long serialVersionUID = -729624360020627702L;

	@Id
	private String id;
   
	@Field(type = FieldType.Keyword)
    private String customer_time;
}

在操作过程中可能会报这个错误:java.lang.IllegalArgumentException: Could not resolve placeholder ‘index.name’ in value "${index.name}
原因可能是使用@Value的类上未指定配置文件:@PropertySource("classpath:application.properties")
也可能是你的配置文件是yml类型,而该注解只支持properties文件引入,并不支持yml,至于如何让其可以加载yml文件,自行搜索。

2.在代码中设置indexName(可以根据条件设置不同的indexName)

创建配置Bean:

@Component("esAttribute")
public class EsAttribute {
  
    private String indexName;

    public String getIndexName() {
        return indexName;
    }

    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }
}

在你需要的地方设置indexName:

@Autowired
private EsAttribute esAttribute;
// 动态设置索引名称
esAttribute.setIndexName("tomcat1-*");
logger.info("索引名称indexName:" + esAttribute.getIndexName());

在ElasticSearch返回的类型中使用:

@Data
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "#{@esAttribute.indexName}", shards = 1, replicas = 0,createIndex = true)
public class AppLogBean implements Serializable {
	
	private static final long serialVersionUID = -729624360020627702L;

	@Id
	private String id;
   
	@Field(type = FieldType.Keyword)
    private String customer_time;
}

八、ES嵌套类型

1、Nested

ES嵌套(Nested)文档使用文章来源地址https://www.toymoban.com/news/detail-738704.html

  • ES中 Nested 类型的原理和使用
  • Elasticsearch Nested类型及应用【2】

2、父子文档

  • ElasticSearch(四):ES nested嵌套文档与父子文档处理
  • elasticsearch之嵌套对象、父子文档

到了这里,关于Elastic Search一些用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elastic Search的RestFul API入门:如何进行ES的查询-search

    在这篇教学文章中,我们将深入探讨Elasticsearch的search功能。这是一个非常强大且灵活的功能,它允许我们对存储在Elasticsearch中的数据进行各种复杂的查询和分析。本章的目标是让读者理解如何进行Elasticsearch的搜索,以及如何在搜索过程中自主调整搜索参数,从而灵活地控制

    2024年02月03日
    浏览(49)
  • 使用docker安装elastic search[ES]和kibana

    使用docker安装elastic search和kibana,版本均为7.17.1 docker pull# 去dockerhub看具体版本,这里用7.17.1 临时安装生成文件# 参数说明 -d 后台启动 –name 起别名即:NAMES -p 9200:9200 将端口映射出来 elasticsearch的9200端口是供外部访问使用;9300端口是供内部访问使用集群间通讯 -e “discovery.

    2024年02月14日
    浏览(48)
  • Docker安装ElasticSearch、Kibana、IK分词器以及设置ES账户密码

    版本声明: 系统 :CentOS 7.9(云服务器) ES版本 :7.6.1 Kibana :7.6.1 Ik分析器版本 :7.6.1 1、拉取镜像 2、创建挂载目录 设置所有用户读写执行权限 : sudo chmod -R 777 /docker_config/elasticsearch/ 3、创建elasticsearch.yml 配置文件 4、创建容器 参数说明 : -p 端口映射 -e discovery.type=single

    2023年04月09日
    浏览(71)
  • es--Elastic Search深度分页问题分析及四种解决方案

    ​ Elasticsearch的深度分页是指当你需要查询的结果数量非常多时,需要分页查询的第n页时,每次查询都需要扫描前n-1页的数据来获取结果。这样会导致性能问题,因为它需要很长的时间来完成查询。 Scroll API: Scroll API可以让你在每个查询阶段中存储状态。这样,你就不需要从

    2024年02月08日
    浏览(42)
  • ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案

    本文是ElasticSearch第三讲,在了解ElaticSearch之后,我们还要了解Elastic背后的生态 即我们 常说的ELK ;与此同时,还会给你展示ElasticSearch的 案例场景 ,让你在学习ES前对它有个全局的印象。 Beats + Logstash + ElasticSearch + Kibana 如下是我从官方博客中找到图,这张图展示了ELK生态以

    2024年02月07日
    浏览(39)
  • Elasticsearch ES 简单查询 Query String Search 入门

    尝试了text类型排序需要特别处理下. \\\"reason\\\" : \\\"Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index.

    2024年02月16日
    浏览(45)
  • Elasticsearch分词详解:ES分词介绍、倒排索引介绍、分词器的作用、停用词

    详见:https://blog.csdn.net/weixin_40612128/article/details/123476053

    2024年02月12日
    浏览(52)
  • 【elastic search】JAVA操作elastic search

    目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 本文是作者ES系列的第三篇文章,关于ES的核心概念移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 关于ES的下载安装教程以及基本使用,移步: https://bugman.blog.csdn.net/article/details/135342256?spm=1001.2014.3001.5502 在前文

    2024年01月25日
    浏览(50)
  • es elasticsearch 十 中文分词器ik分词器 Mysql 热更新词库

    目录 中文分词器ik分词器 介绍 安装 使用分词器 Ik分词器配置文件 Mysql 热更新词库 介绍 中文分词器按照中文进行分词,中文应用最广泛的是ik分词器 安装 官网下载对应版本zip 下载  放到  plugins 目录 新建 ik文件夹 考入解析zip 重启 es //分成小单词 使用分词器 ik_max_word分成

    2024年02月07日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包