首页 > 其他分享 >全文检索Elasticsearch

全文检索Elasticsearch

时间:2024-12-17 15:21:36浏览次数:4  
标签:搜索 索引 查询 单词 全文检索 文档 Elasticsearch

一、什么是Elasticsearch?

Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎。它建立在Apache Lucene库之上,能够提供快速、近实时的搜索功能,并且可以处理大规模的数据。

  • 分布式架构

    • Elasticsearch可以将数据分布在多个节点(服务器)上,通过分片(Shard)机制来存储和管理数据。每个分片是一个独立的Lucene索引,这样可以水平扩展存储容量和处理能力。例如,当数据量从100GB增长到1TB时,可以简单地添加更多节点来分担存储和查询负载。
    • 它还通过副本(Replica)机制来提高数据的可用性和容错性。副本是主分片的拷贝,当主分片所在节点出现故障时,副本可以接替主分片进行工作,确保数据仍然可以被查询和处理。
  • RESTful API接口

    • 提供了简单易用的RESTful接口,这意味着可以使用HTTP请求(如GET、POST、PUT、DELETE)来操作Elasticsearch。例如,要向索引中添加一个文档,可以发送一个POST请求到相应的索引端点,请求体中包含文档的数据。这种方式使得它很容易与各种编程语言集成,像Java、Python、JavaScript等语言都有对应的客户端库来方便地调用这些API。

二、数据存储与索引

  • 索引(Index)
    • 在Elasticsearch中,索引类似于传统数据库中的数据库概念。它是存储和管理文档(Document)的地方。一个索引可以包含多个类型(在Elasticsearch 7.0之后,类型被弱化,一个索引通常只包含一种主要类型的数据)的文档,这些文档可以有不同的结构,但通常都有一些共同的字段用于搜索和过滤。例如,在一个电商系统中,可以有一个名为“products”的索引,其中存储了各种商品的文档,包括商品名称、价格、描述等字段。
  • 文档(Document)
    • 文档是Elasticsearch中存储的基本单元,它是一个JSON格式的数据对象。例如,在上述电商系统的“products”索引中,一个商品文档可能如下:
{
    "name": "iPhone 15",
    "price": 7999,
    "description": "Apple's latest smartphone with advanced features."
}
- 文档在索引中是通过唯一标识符(_id)来标识的,这个标识符可以由用户指定,也可以由Elasticsearch自动生成。
  • 字段(Field)
    • 文档中的每个属性就是一个字段。在上面的例子中,“name”、“price”和“description”都是字段。Elasticsearch会对这些字段进行索引,根据字段的数据类型(如字符串、数字、日期等)采用不同的索引策略,以方便后续的搜索操作。

三、全文检索功能

  • 分词(Tokenization)
    • 当进行全文检索时,Elasticsearch首先会对文本字段进行分词。分词是将一段文本按照一定的规则拆分成一个个单词(Token)的过程。例如,对于文本“Elasticsearch is a powerful search engine”,会被分词为["Elasticsearch", "is", "a", "powerful", "search", "engine"]。它支持多种分词器,如标准分词器(Standard Analyzer)、中文分词器(如IK Analyzer)等。不同的分词器有不同的分词规则,比如中文分词器能够根据中文的语义和词汇规则进行分词。
  • 倒排索引(Inverted Index)
    • 倒排索引是全文检索的核心数据结构。它是以单词为键,包含该单词的文档列表为值的索引。例如,如果有三个文档,文档1包含单词“apple”和“banana”,文档2包含单词“banana”和“cherry”,文档3包含单词“apple”和“cherry”,那么倒排索引可能如下:
      |单词|文档列表|
      |---|---|
      |apple|[1, 3]|
      |banana|[1, 2]|
      |cherry|[2, 3]|
    • 当用户查询一个单词时,Elasticsearch可以通过倒排索引快速找到包含该单词的文档,然后根据相关性评分(如TF - IDF算法等)来对这些文档进行排序,将最相关的文档排在前面返回给用户。

四、查询类型

  • 简单查询(Match Query)
    • 这是最基本的查询类型,用于在一个或多个字段中查找包含指定关键词的文档。例如,在“products”索引中,使用Match Query查找包含“smartphone”关键词的商品文档:
{
    "query": {
        "match": {
            "description": "smartphone"
        }
    }
}
- 它会对查询的字段进行分词,并在倒排索引中查找匹配的文档。
  • 短语查询(Match Phrase Query)
    • 用于查找包含指定短语的文档。短语查询要求文档中的单词顺序和查询短语中的单词顺序一致。例如,查询包含“latest smartphone”短语的文档:
{
    "query": {
        "match_phrase": {
            "description": "latest smartphone"
        }
    }
}
  • 布尔查询(Bool Query)
    • 布尔查询允许组合多个查询条件,通过逻辑运算符(AND、OR、NOT)来构建复杂的查询。例如,查找包含“smartphone”且价格小于10000的商品文档:
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "description": "smartphone"
                    }
                }
            ],
            "must_not": [
                {
                    "range": {
                        "price": {
                            "gte": 10000
                        }
                    }
                }
            ]
        }
    }
}

五、应用场景

  • 电商搜索
    • 为电商网站提供商品搜索功能,用户可以通过关键词搜索商品,如搜索“运动鞋”可以快速找到所有相关的运动鞋产品。同时,还可以根据价格范围、品牌等条件进行过滤和排序,提供精准的搜索体验。
  • 日志分析
    • 收集和分析系统日志。例如,在一个大型的数据中心,通过Elasticsearch可以快速搜索特定时间段内包含“error”关键词的日志,帮助运维人员快速定位和解决问题。
  • 企业搜索
    • 在企业内部,用于文档管理和搜索。员工可以通过关键词搜索公司内部的各种文档,如政策文件、报告、邮件等,提高信息获取的效率。

标签:搜索,索引,查询,单词,全文检索,文档,Elasticsearch
From: https://www.cnblogs.com/java-note/p/18612538

相关文章

  • ElasticSearch中的深度分页问题
    在使用ElasticSearch进行搜索时,很多小伙伴会遇到“深度分页”问题。当需要获取大量的分页数据时,查询性能会急剧下降,甚至导致集群负载过高。这篇文章将深入剖析ElasticSearch深度分页的成因、危害,并提供一些常用的优化方案。一、什么是深度分页?深度分页的定义在Elastic......
  • 23、Elasticsearch-fielddata内存使用陡增解决方案
    利用searchAfter分页方式代替From-Size查询或Scroll滚动查询,解决From-Size查询存在的深度翻页问题与Scroll滚动查询存在数据量大响应慢的问题。由于searchAfter分页需要保证排序聚合唯一,当使用_id字段进行排序聚合时,可能会导致fielddata内存使用指标陡增,从而导致集群的内存使用率......
  • Docker安装Redis和Elasticsearch
    本章将和大家分享在Docker中如何安装Redis和Elasticsearch。废话不多说,下面我们直接进入主题。一、Docker安装Redis1、拉取最新版的redis镜像dockerpullredis2、查看本地镜像dockerimages3、从官网获取redis.conf配置文件创建并进入指定目录(可自定义)://进入......
  • Elasticsearch、Logstash和Kibana
    ELK概述定义与组成部分:ELK是Elasticsearch、Logstash和Kibana的缩写,这三个工具共同构成了一个强大的日志管理和分析平台。Elasticsearch:是一个分布式的、RESTful风格的搜索和数据分析引擎。它能够存储和索引大量的数据,并提供快速的搜索功能。其核心功能是对数据进行索引,使得......
  • ElasticSearch 常见故障解析与修复秘籍
    文章目录一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高,read_only状态问题解决六、Elas......
  • docker启动ES增加elasticsearch-header访问,解决跨域问题
    在做一件什么事情:docker部署ES服务,希望增加可视化工具。于是选择了一种简单的方式,增加elasticsearch-header组件访问。这样只需要在浏览器上输入地址可以直接访问。遇到了什么问题:提示跨域访问问题分析:服务器端放开访问限制解决方案:增加跨域访问配置脚本如下:点击查看代......
  • 【Elasticsearch】关键数据类型
    ......
  • Elasticsearch实战应用:打造高效的全文搜索与高亮显示功能
    Elasticsearch实战应用:打造高效的全文搜索与高亮显示功能在当今的互联网环境中,高效的全文搜索功能已成为众多电商平台、新闻网站、博客系统等应用场景的核心需求。Elasticsearch作为一款开源的全文检索服务器,凭借其强大的倒排索引机制和灵活的查询能力,成为实现这一需求的理......
  • 推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue
    推荐一款轻量级且强大的ElasticsearchGUI:elasticvue很多同学都是用过Elasticsearch的GUI工具Kibana,但Kibana相对比较重,这篇文章,笔者推荐推荐一款轻量级且强大的ElasticsearchGUI:elasticvue。1下载安装进入:https://github.com/cars10/elasticvue/releases/t......
  • 在Elasticsearch (ES) 中,integer 和 integer_range的区别
    在Elasticsearch(ES)中,integer和integer_range是两种不同的字段类型,它们用于存储和查询不同类型的数据。Integer:integer类型是用于存储32位整数值的简单数据类型。这个类型的字段适合用来表示单一的整数数值,例如用户的年龄、商品的数量等。支持标准的数值操作......