首页 > 其他分享 >Elasticsearch

Elasticsearch

时间:2024-10-16 11:10:34浏览次数:6  
标签:索引 Elasticsearch 分词器 elasticsearch type es

Elasticsearch

ES是一个可以实现复杂搜索的全文检索服务器

一、安装

1.安装Elasticsearch

指定分配521m内存,可以改为256m,安装完成访问9200端口测试

docker run -d \
  --name es \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -e "discovery.type=single-node" \
  -v es-data:/usr/share/elasticsearch/data \
  -v es-plugins:/usr/share/elasticsearch/plugins \
  --privileged \
  --network work-net \
  -p 9200:9200 \
  -p 9300:9300 \
  elasticsearch:7.12.1

2.安装Kibana

图形化展示Elasticsearch内容,提供开发控制台对其接口进行语法提示,访问5601端口进行测试,第一次打开选择Explore on my own -> Dev tools

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=hm-net \
-p 5601:5601  \
kibana:7.12.1

3.安装IK分词器

提供对文档分词的功能

docker exec -it es ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

安装完成后重启Elasticsearch容器

docker restart es

二、使用

1.模糊查询关键字时使用倒排索引

在查询之前,向Elasticsearch发出创建索引,analyzer 属性用于指定在索引和搜索时如何分析文本字段,index 属性用于控制字段是否被索引,properties type为object时会用到,该字段的子字段

PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}

2.生成倒排索引以及原理

当创建倒排所以后,Elasticsearch会按照指定的是否索引以及分词规则对需要被索引的字段分成词条,随后按照词条去搜索其出现的位置,记录下来生成一张表,如下

词条 出现位置
小米 1,3,5,7
苹果 2,4,6
三星 8,9

以后,当用户发出模糊查询时,将模糊查询的语句分成词条,去表中查找出现位置,再按照出现位置去表中正向搜索,返回数据

三、索引的操作

新增已在上方,下面只写改删查

1.改

索引不支持修改已经填写的数据,只能新增

PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

2.删、查

DELETE /索引库名
GET /索引库名

四、IK分词器的使用

Elasticsearch官方默认分词器会将中文分成一个一个字,因此使用IK分词器,ik分词器包含两种模式

  • ik_smart:只能语义切分
  • is_max_word:最细粒度切分

添加网络新词,进入IK分词器内的config下,修改IKAnalyzer.cfg.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典 *** 添加扩展词典-->
        <entry key="ext_dict">ext.dic</entry>
</properties>

在config下新建ext.dic,在内部输入新词

泰酷辣
蜜雪冰城

重启Elasticsearch

docker restart es

五、JavaAPI的使用

1.导入依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

因为SpringBoot默认的ES版本是7.17.10,所以我们需要覆盖默认的ES版本

  <properties>
      <maven.compiler.source>11</maven.compiler.source>
      <maven.compiler.target>11</maven.compiler.target>
      <elasticsearch.version>7.12.1</elasticsearch.version> <!-- 修改此处-->
  </properties>

2.初始化RestHighLevelClient

新建配置类,将Kibana生成索引的内容粘贴过来,并初始化RestHighLevelClient

@Configuration
public class EsConfig {

    public static final String HOST = "http://121.43.129.12:9200";

    public static final String MAPPING_TEMPLATE = "{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"id\": {\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"name\":{\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\"\n" +
            "      },\n" +
            "      \"price\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"stock\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"image\":{\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "      \"category\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"brand\":{\n" +
            "        \"type\": \"keyword\"\n" +
            "      },\n" +
            "      \"sold\":{\n" +
            "        \"type\": \"integer\"\n" +
            "      },\n" +
            "      \"commentCount\":{\n" +
            "        \"type\": \"integer\",\n" +
            "        \"index\": false\n" +
            "      },\n" +
            "      \"isAD\":{\n" +
            "        \"type\": \"boolean\"\n" +
            "      },\n" +
            "      \"updateTime\":{\n" +
            "        \"type\": \"date\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";

    @Bean
    public RestHighLevelClient client() {
        return new RestHighLevelClient(
                RestClient.builder(HttpHost.create(HOST))
        );
    }

}

3.创建索引

    @Autowired
    private RestHighLevelClient client;

    @Test
    public void test() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("items");
        request.source(EsConfig.MAPPING_TEMPLATE, XContentType.JSON);
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        log.info("isOK?:{}",createIndexResponse.isAcknowledged());
    }

标签:索引,Elasticsearch,分词器,elasticsearch,type,es
From: https://www.cnblogs.com/superdebu/p/18469449

相关文章

  • elasticsearch之倒排索引
    倒排索引elasticsearch有如此高的搜索性能,无异于使用了倒排索引。倒排索引中有两个重要的概念:文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我......
  • Elasticsearch(一)
    ES相关概念对比MySQLElasticsearch(ES):用于数据存储、计算和搜索安装ES:ES是部署在Linux操作系统下的,可以通过Docker去部署:首先引入ES的镜像,可以官网下载或者用dockerpull拉取镜像可以执行该命令,注意es版本dockerrun-d\--namees\-e"ES_JAVA_OPTS=-Xms512m-Xmx512......
  • ElasticSearch的倒排索引和相关概念与MySQL的对比
    ElasticSearch的倒排索引和相关概念在用关系型数据库时,一些频繁用作查询条件的字段我们都会去建立索引来提升查询效率。在关系型数据库中,我们一般都采用B树索引进行存储,所以B树索引也是我们接触比较多的一种索引数据结构,但是在使用过程中,我们发现无法使用关系型数据库进行类......
  • Elasticsearch 倒排索引,ES相关概念对比MySQL
    elasticsearch之所以有如此高性能的搜索表现,正是得益于底层的倒排索引技术。什么是倒排索引?倒排索引的概念是基于MySQL这样的正向索引而言的。倒排索引中有两个非常重要的概念:文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息词条(Te......
  • Elasticsearch相关概念对比MySQL
    Elasticsearch相关概念对比MySQLElasticsearch中,文档指的是每一条数据,例如:我喜欢你。词条指的是将文档拆分成有意义的词语,例如之前的文档可拆成4个词条:我、喜欢、你。MySql中的概念Elasticsearch中的概念Table表Index索引,文档的集合Row一行行数据Document文档......
  • Elasticsearch介绍
    Elasticsearch是一个分布式搜索和分析引擎,通常用于处理大规模的结构化和非结构化数据。它基于开源的Lucene库,提供了强大、实时的搜索能力和精细的分析功能。Elasticsearch通常与其他工具(如Logstash、Kibana等)一起使用,构成了著名的ELKStack(后来改名为ElasticStack)。完整......
  • Elasticsearch
    什么是ElasticsearchElasticsearch是一个基于ApacheLucene的分布式搜索和分析引擎。它提供了一个功能强大、实时的数据存储、检索和分析的平台,尤其适合处理结构化和非结构化数据。它在大数据处理、全文搜索****、实时日志分析、监控等场景下应用广泛。核心概念索引(Index):相......
  • Elasticsearch正向索引与倒排索引
    Elasticsearch正向索引与倒排索引一、正向索引首先,要明白什么是正向索引,所谓正向索引,就是在查找某项数据时,按照id一条一条查找,如果当前数据中包含所需数据,则将当前数据取出,不包含则抛弃,直至全部遍历结束。例如:当我们按照正向索引去寻找包含小米三星苹果的数据时,会从头遍历一遍,......
  • Elasticsearch相关概念对比MySQL
    MySQLElasticsearch说明TableIndex索引(index),就是文档的集合,类似数据库的表(table)RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)SchemaMappingMappi......
  • Elasticsearch相关概念对比MySQL
    Elasticsearch和MySQL是两种不同的数据管理系统,各自有其独特的概念和应用场景。以下是它们在几个关键概念上的对比:o数据模型Elasticsearch:。文档(Document):基本的数据单元,存储为JSON格式。。索引(Index):类似于数据库,包含多个文档。。类型(Type):在7.x版本后已被弃用,之前用于逻......