Lucent's Blog

当时明月在 曾照彩云归

人生不相见,动如参与商。

6LCi5Y2O5qKFLOaIkeaDs+S9oOS6hg==


Elasticsearch的使用

什么是Elasticsearch?

​ Elasticsearch是一个开源的分布式、RESTful 风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。  Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库——无论是开源还是私有,但它也仅仅只是一个库。为了充分发挥其功能,你需要使用 Java 并将 Lucene 直接集成到应用程序中。 更糟糕的是,您可能需要获得信息检索学位才能了解其工作原理,因为Lucene 非常复杂。  为了解决Lucene使用时的繁复性,于是Elasticsearch便应运而生。它使用 Java 编写,内部采用 Lucene 做索引与搜索,但是它的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。  当然,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。 它可以被下面这样准确地形容:

  • 一个分布式的实时文档存储,每个字段可以被索引与搜索;
  • 一个分布式实时分析搜索引擎;
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

由于Elasticsearch的功能强大和使用简单,维基百科、卫报、Stack Overflow、GitHub等都纷纷采用它来做搜索。现在,Elasticsearch已成为全文搜索领域的主流软件之一。

专业术语

节点 node

节点是属于集群的Elasticsearch的运行实例 。可以在单个服务器上启动多个节点,但是通常每个服务器应该有一个节点。在启动时,节点将使用单播来发现具有相同集群名称的现有集群,并将尝试加入该集群

索引 index

索引就像关系数据库中的表。它具有一个包含type的 映射,该type包含索引中的字段。索引是一个逻辑名称空间,它映射到一个或多个 主分片,并且可以具有零个或多个 副本分片。

文档 document

文档是JSON对象(在其他语言中也称为hash / hashmap /关联数组),其中包含零个或多个 字段或键-值对。被索引的原始JSON文档将存储在 _source字段中,该字段在获取或搜索文档时默认返回。

字段 field

一个文件包含字段或键-值对的列表。该值可以是简单(标量)值(例如,字符串,整数,日期),也可以是嵌套结构(如数组或对象)。字段类似于关系数据库中表中的列。所述映射用于每个字段具有一个字段类型(不要与文件相混淆类型),其指示可以被存储在该字段中的数据,例如类型integer,string, object。该映射还允许您定义(除其他事项外)应如何分析字段的值。

image-20210608090513102

ID 每个文档id唯一

文档 的ID 标识文档。该 index/id文件中必须是唯一的。如果没有提供ID,则会自动生成。

映射 mapping

映射就像关系数据库中的架构定义。每个 索引都有一个映射,该映射定义一个type,以及许多索引范围的设置。

映射可以明确定义,也可以在为文档建立索引后自动生成。

过滤 filter

过滤器是不计分的查询,表示它不对文档进行计分。它只关心回答问题“此文档是否匹配?”。答案始终是简单的二进制“是”或“否”。这种查询据说是在过滤器上下文中进行的,因此称为过滤器。过滤器是对集合包含或排除的简单检查。在大多数情况下,过滤的目的是减少必须检查的文档数量。

类型 type

用于表示文档类型的类型,例如an email,a user或a tweet。类型已弃用,正在删除中。7.x只保留了_doc类型,8.0以后将彻底删除类型。

本项目中的应用

版本

本项目使用了7.9.3版本

pom.xml

<!--elasticsearch-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
	<version>7.9.3</version>
</dependency>

分词插件

本项目使用的分词插件为

elasticsearch-analysis-ik  #版本7.9.3
elasticsearch-analysis-pinyin  #版本7.9.3

拼音分词的实现

拼音分词的方法有两种,第一种是利用过滤器,将中文分词插件ik分词之后的结果进行拼音分词,这种方式我尝试了几次,结果并不符合我的预期,所以又想出了第二种简单的方法。

实现方式:

查看pce/pce-credit/pce-credit-biz/src/main/java/blog/lucent/pce/credit/dto/EntDto.java

image-20210608093854446

image-20210608093913163

设置两个完全相同的字段,并指定不同的分词器,一个用于中文分词,一个用于拼音分词,搜索时只需要根据不同的条件搜索不同的字段即可,搜索引擎会根据初始创建的映射使用对应的分词器进行分词。

image-20210608094211353

我们的项目只需要手动安装Elasticsearch和分词插件即可,映射(mapping)会在第一次启动时自动创建。

所以一定要先安装好分词插件再启动项目。

代码如下:

image-20210608094350635

管理

Elasticsearch可以使用kibana可视化工具进行管理。

image-20210608095248775

Elasticsearch也可以使用DSL进行管理,就相当于用sql语句查询数据库,例如:

GET ent/_search
{
    "query": {
        "match" : {
            "entName" : "this is a test"
        }
    }
}
#这是一条简单的查询语句
PUT /ent/_mapping
{
  "properties": {
        "entName": {
          "type": "text",
          "analyzer": "ik_max_word_pinyin",
          "search_analyzer": "ik_max_word_pinyin"
        },
        "frName": {
          "type": "text",
          "analyzer": "ik_max_word_pinyin",
          "search_analyzer": "ik_max_word_pinyin"
        }
       
      }
 }
 #设置索引ent的映射,其中指定了每个字段的类型和分词器 
#向索引ent中插入一条数据(_doc后面的3是指定的id,不指定则自动生成)
PUT ent/_doc/3
{
  "entName":"测试"
}
#删除一条数据
DELETE ent/_doc/3
{

}
#以上两条命令区别仅仅是请求方式一个put一个delete,搜索引擎会根据不同请求方式执行不同命令

这些命令都可以在shell中执行,但是kibana提供了更好用的命令行控制台。

image-20210608100350304

上一篇

阅读
下一篇

Elasticsearch安装分词插件…

阅读