首页 > 其他分享 >[转]Elasticsearch全文检索入门这一篇就够了

[转]Elasticsearch全文检索入门这一篇就够了

时间:2023-11-01 11:24:26浏览次数:38  
标签:index 索引 mapping 就够 全文检索 Elasticsearch test 文档 type

本文仅针对搜索与Elasticsearch小白,先介绍了全文搜索的原理,然后介绍了Elasticsearch中的一些基本概念,接着讲解如何在Elasticsearch中插入文档构建查询索引,最后介绍Elasticsearch的线上查询API的使用方式。

全文搜索原理

顺序扫描

如何实现全文搜索?最简单的方法就是用正则去匹配文档中的字符串。这种方式看似粗暴,但却不乏使用场景,比如Linux中的grep命令,Windows中用Ctrl+F在文件中进行查找等。

这种方式的缺点就是效率低,需要扫描全部文件,有时候搜索一个磁盘可能检索大半个小时。但Mac的spotlight搜索却是非常快,这是如何实现的了?

倒排索引

大家都知道,在数据库中直接全表查询的时间复杂度是o(n),如果对索引列进行查询,其时间复杂度为o(logn),如果数据以key-value形式存储,查询时间复杂度将降为o(1)。那么在全文搜索中我们直接建立从查询词到文档的映射是不是也就获得了o(1)的查询性能?这种词汇到文档的映射被称之为倒排索引。那么倒排索引是如何构建的呢?一般流程如下:

当然实际在切词后还会做一些去停用词、词目还原等操作,以提升索引质量。

下面将介绍如何用Elasticsearch完成上面倒排索引的构建过程,然后在倒排索引上进行各种查询。

基本概念

索引、类型与文档

索引:含相同属性的文档集合。相当于关系型数据库中的一个database

类型:索引可以定义一个或者多个类型,文档必须属于一个类型,其相当于关系型数据库中的表,是通过mapping定义的。mapping中主要包括字段名、字段数据类型和字段索引类型这3个方面的定义,相当于关系型数据库中的schema。

文档:可以被索引的基本数据单位,也是全文搜索中被搜索的对象,可以对应一个网页,一篇txt文档或者一个商品。 相当于关系型数据库中的表中的一行记录。

举个例子,假设现在有大量的数据,有网页,有图片,有视频,有学术论文等,现在你打算基于这些数据用ES打造一个搜索引擎。由于这些数据高度异构,你可能对网页、图片、视频、论文等分别构建不同的”索引“。以Bing搜索为例,其上方的不同选项卡,对应着不同的索引。

在学术论文索引中,为了支持作者查询,机构查询,发表时间查询等多种查询模式,你需要定义多种”类型“,在定义”类型“时,你需要通过mapping文件定义各个字段的类型,处理方式(如切词、过滤等),然后所有文档将基于这个mapping文件来构建倒排索引。可以说一个”类型”对应一个倒排索引表。

具体的一篇论文即为一篇”文档“。

分片 备份

分片

有时候一个索引的数据量非常大,甚至超出了单机的存储能力,这个时候需要对索引分片存储,分别存到不同机器上。

备份

为了防止节点故障到时索引分片丢失,一般会对分片进行备份。备份除了可以保障数据安全性,还可以分担搜索的压力。

ES创建索引默认5个分片,1个备份,分片只能在创建索引的时候指定而备份可以后期动态修改。

安装部署

官网下载Elasticsearch安装包,并解压到指定目录。

然后进入安装目录,启动命令:

./bin/elasticseatch

然后运行

curl localhost:9200

如果返回集群信息,说明安装成功。

build索引

ES提供了丰富的REST API

创建索引

直接运行

curl -XPUT "localhost:9200/index_test"

会创建名为index_test的索引,ES会根据插入的数据自动创建type与mapping,可以通过配置文件关闭ES的自动创建mapping功能。

也可以手动指定mapping,请求方式如下

curl -XPUT "localhost:9200/index_test" -d ' # 注意这里的'号
{
  "settings": {
    "index": {
      "number_of_replicas": "1", # 设置复制数
      "number_of_shards": "5" # 设置主分片数
    }
  },
  "mappings": { # 创建mapping
    "test_type": { # 在index中创建一个新的type(相当于table)
      "properties": {
        "name": { # 创建一个字段(string类型数据,使用普通索引)
          "type": "string",
          "index": "not_analyzed"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }
}

 

也可以通过json文件的方式指定mapping :

  • 创建一个扩展名为test_type.json的文件名,其中test_type就是mapping所对应的type名。
  • 在test_type.json中输入mapping信息。假设你的mapping如下:
{
  "test_type": { # 注意,这里的test_type与json文件名必须一致
      "properties": {
        "name": {
          "type": "string",
          "index": "not_analyzed"
        },
        "age": {
          "type": "integer"
        }
      }
    }
  }

 

  • 在$ES_HOME/config/路径下创建mappings/index_test子目录,这里的index_test目录名必须与我们要建立的索引名一致。将test_type.json文件拷贝到index_test目录下;
  • 创建index_test索引'''curl -XPUT "localhost:9200/index_test" # 注意,这里的索引名必须与mappings下新建的index_test目录名一致'''。

可以通过请求

curl -XDELETE 'localhost:9200/index_test/_mapping/test_type'

删除mapping或者通过

curl -XGET 'localhost:9200/index_test/_mapping/test_type'

查看mapping。

可以通过请求

curl -XDELETE "localhost:9200/index_test"

删除该索引。

插入文档

可通过请求

curl -XPUT 'localhost:9200/index_test/test_type/1?pretty' -d ' # 这里的pretty参数的作用是使得返回的json显示地更加好看。1是文档的id值(唯一键)。
{
    "name": "zhangsan",
    "age" : "12"
}'

 

添加或更新文档。也可以通过id来删除文档

curl -XDELETE 'localhost:9200/index_test/test_type/1?pretty' 

查询操作

简单查询

查询单个文档

curl -XGET 'localhost:9200/index_test/test_type/1?pretty'。 

 

通过url地址来指定查询范围

搜索

查询指定属性

如在字段name中查找“一页书”;

{
    "query":{
        "match":{
            "name":"一页书"
        }
    }
}

 

结构化查询

如查询age在18-60之间的文档

{
    "query":{
        "range":{
        "age{
                    "gte":18,
             "lte":60
                   }
        }
    }
}

 

也支持filter操作,速度比query快,需要结合布尔类型使用。

多个条件联合查询

如查找name中包含“一页书“且age为18的文档。

{
    "query":{
    “bool”: {
        "must":[
            {
             "match":{
                        "name":"一页书"
                        }
            },
            {
            "filter":{
                "term"{
                            "age":18
                           }
                }
            }
            ]
        }
           }
}

 

支持must(与)、should(或)、must not等逻辑运算。

match、macth_phrase、multi_match与term的区别

  • match对会先对query进行分词,只要文档里面包含一个query中一个词就会被搜出来;
  • macth_phrase也会对query进行分词,但一个文档必须包含query里面所有的词才会被搜出来,可以通过slop参数降低这种约束;
{
  "query": {
    "match_phrase": {
        "content" : {
            "query" : "我的宝马多少马力",
            "slop" : 1
        }
    }
  }
}

 

  • multi_match对多个字段同时进行匹配;
  • term表示完全匹配,不对query进行分词,直接去匹配索引。

当然搜索是一项庞大的工程,要达到商业可用,还需要做很多事情,比如如何导入批量数据与流数据,Query纠错与改写,搜索排序,下拉推荐,个性化等,后面将一一进行介绍。

 

转自  https://zhuanlan.zhihu.com/p/94181307

标签:index,索引,mapping,就够,全文检索,Elasticsearch,test,文档,type
From: https://www.cnblogs.com/siyunianhua/p/17802593.html

相关文章

  • elasticsearch运维调优-集群和冷热集群
    集群:node1-node3专用主节点node3仅投票节点 启动服务:./bin/elasticsearch后台启动守护进程./bin/elasticsearch推荐方式./bin/elasticsearch-d-ppid关闭进程ps-ef|grepelastic杀进程kill-9'catpid'pkill-Fpid常见问题:本地无法访问:关闭防火墙,生产环境建......
  • ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑
    ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑1.Elasticsearch产生背景大规模数据如何检索如:当系统数据量上了10亿、100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1)用什么数据库好?(mysql、oracle、mongodb、hbase…)2)如......
  • ELASTICSEARCH-监控工具cerebro
    文件摘自https://www.cnblogs.com/hogan0210/p/16279731.html  cerebro下载地址:https://github.com/lmenezes/cerebro/releases/download/v0.9.4/cerebro-0.9.4.tgz1、解压tar-zxvfcerebro-0.9.4.tgz2、配置访问elasticsearch服务(可配置多个,不配置不可访问)修改cereb......
  • 低代码开发是不是“简易低智”的玩具?看这篇就够了
        低代码的概念自2014年由研究机构Forrester提出以来,已经在国外市场逐渐成熟,形成了稳定的商业模式。而在国内,从2018年开始,这一理念逐渐受到广泛关注,尽管初期伴随着一些质疑的声音,如“简易低智”、“新瓶旧酒”等批评,甚至有观点认为这只是一些“外包公司”贴上的新标签。......
  • 【Elasticsearch】es脚本编程使用详解
    目录一、es脚本语言介绍1.1什么是es脚本1.2es脚本支持的语言1.3es脚本语言特点1.4es脚本使用场景二、环境准备2.1docker搭建es过程2.1.1拉取es镜像2.1.2启动容器2.1.3配置es参数2.1.4重启es容器并访问2.2docker搭建kibana过程2.2.1拉取kibana镜像2.2.2启动kibana容器2.......
  • ELK中 Elasticsearch和Logstash内存大小设置的考虑
    本文为博主原创,转载请注明出处:在ELK(Elasticsearch、Logstash和Kibana)日志采集和分析场景中,适当设置Logstash和Elasticsearch的内存大小非常重要。这可以确保系统能够高效地处理大量的日志数据,并提供快速的搜索和分析功能。对于Logstash和Elasticsearch的内存大小设置,没......
  • ElasticSearch基础
    ES基本概念端口9300:ElasticSearch集群间组件通信端口9200:浏览器访问的http协议RESTful接口。http://localhost:9200Windows单机启动之前可能需要修改的部分地方config/elasticsearch.ymlxpack.security.enabled:false:改为false,禁用安全访问。bin/elasticsearch-env.ba......
  • 释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握
    释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[1.安装部署篇--简洁版],支持Linux/Windows部署安装效果展示PaddleNLPPipelines是一个端到端智能文本产线框架,面向NLP全场景为用户提供低门槛构建强大产品级系统的能力。本项目将通过一种简单高效的......
  • 释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握
    释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[1.安装部署篇--简洁版],支持Linux/Windows部署安装效果展示PaddleNLPPipelines是一个端到端智能文本产线框架,面向NLP全场景为用户提供低门槛构建强大产品级系统的能力。本项目将通过一种简单高效的......
  • ElasticSearch
    一、简介          简称ES,开源高扩展分布式全文检索引擎。可以近乎实时存储,检索数据。扩展性良好,可扩展数百台服务器,处理PB级别的数据。   ES也使用Java开发并使用Lucene作为核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RestfulApi来隐藏......