ElasticSearch全文搜索引擎

文章介绍了全文检索的基本概念,包括Lucene的索引原理和ElasticSearch的核心特性。ElasticSearch作为基于Lucene的分布式搜索引擎,提供了简化接口和高可用性。文章还涉及了ES的安装、Kibana的配置以及JavaAPI操作ES的例子。
摘要由CSDN通过智能技术生成

1.全文搜索概述

1.1 什么是全文检索

狭义的理解主要针对文本数据的搜索

1.2 全文搜索引擎

就是把没有结构的数据,转换为有结构的数据,来加快对文本的快速搜索,通常而言,有结构的数据的查询是很快的,比如: 有序数组,红黑树。

1.3 常见的全文搜索

1)全文搜索工具包-Lucene(核心)

2)全文搜索服务器 ,Elastic Search(ES) / Solr等封装了lucene并扩展  

1.4 什么是Lucene

Lucene是apache下的一个开源的全文检索引擎工具包(一堆jar包)

1.5 Lucene索引原理

索引创建:先对搜索的数据进行分词 - 按规则统一变为小写 - 按规则进行排列 - 合并去重 - 得到倒排索引文档

索引搜索:将倒排索引文档放到索引库 - 用户查询请求就会搜索索引库中的倒排索引文档 - 通过倒排索引文档中关键词的id找到数据区中对应的数据

2.ElasticSearch相关概念

2.1 什么是ElasticSearch

ES是一个分布式的全文搜索引擎,为了解决原生Lucene使用的不足,优化Lucene的调用方式,并实现了高可用的分布式集群的搜索方案,ES的索引库管理支持依然是基于Apache Lucene(TM)的开源搜索引擎。

ES也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐Lucene的复杂性,从而让全文搜索变得简单。

案例:添加索引 ,获取

// 添加
PUT /pet/_doc/4
{
  "name":"猹",
  "sex":0,
  "age":1
}

// 获取
GET /pet/_doc/_search

2.2 ES的特点

1.分布式的实时文件存储

2.分布式全文搜索引擎,每个字段都被索引并可被搜索

3.能在分布式项目/集群中使用

4.本身支持集群扩展,可以扩展到上百台服务器

5.处理PB级结构化或非结构化数据

6.简单的 RESTful API通信方式

7.支持各种语言的客户端

8.基于Lucene封装,使操作简单

2.3 ES和lucene的区别

1.Lucene只支持Java,ES支持多种语言

2.Lucene非分布式,ES支持分布式

3.Lucene非分布式的,索引目录只能在项目本地 , ES的索引库可以跨多个服务分片存储

4.Lucene使用非常复杂 , ES屏蔽了Lucene的使用细节,操作更方便

5.单体/小项目使用Lucene ,大项目,分布式项目使用ES

3.ES下载和安装

3.1 下载ElasticSearch

下载地址:Download Elasticsearch | Elastic

3.2 安装与启动

双击安装目录 bin/elasticsearch.bat即可启动

3.3 ElasticSearch测试

使用浏览器访问:http://localhost:9200

3.4 ES内存配置

如果ES启动占用的内存比较大可以通过修改 jvm.options 文件来修改内存

4.Kibana5安装

4.1 下载Kibana5

下载地址:https://www.elastic.co/downloads/kibana

4.2 安装与启动

执行bin\kibana.bat 即可启动Kibana

4.3 Kinbana连接ES配置

编辑config/kibana.yml,设置elasticsearch.url的值为已启动的ES

默认情况下,Kibana会链接本地的默认ES http://localhost:9200 ,如果需要修改链接的ES服务器,通过修改安装目录下 config/kibana.yml,将配置项 #elasticsearch.url: "http://localhost:9200" 取消注释即可修改连接的ES服务器地址。

4.4 测试Kibana

浏览器访问 http://localhost:5601 Kibana默认地址

5.ElasticSearch基础

5.1 几个基本概念

1.Near Realtime(NRT):近实时

2.Index:索引库

3.Type:类型

4.Document&field:文档

ElastciSearch全文搜索Mysql关系型数据库
索引库(index)数据库(database)
文档类型(Type)数据表(Table)
文档(Document)一行数据(Row)
字段(field)一个列(column)
文档ID主键ID
查询(Query DSL)查询(SQL)
GET http://..SELECT * FROM ...
PUT http://UPDATE table set...

5.2 索引库CRUD

// 添加
PUT /pet/_doc/1
{
  "id":1
  "name":"猹",
  "sex":0,
  "age":1
}

// 获取
GET /pet/_doc/_search

// 全局修改 - 会把ES中的数据全部覆盖
PUT /pet/_doc/2
{
  "id":2
  "name":"大黄",
}

// 局部修改 - 只会修改对应字段
PUT /pet/_doc/3/_update
{
  "id":3
  "name":"大白",
}

6.DSL查询与DSL过滤

6.1 DSL查询案例

GET /pet/_doc/_search
{
  "query":{
    "match":{
      "username":"Hello Java"
    }
  }
}

match如同:where username = Hello or username = Java

term如同:where username = "Hello Java"

6.2 DSL查询+过滤语法(综合案例)

GET /aigou/product/_search 
{
    "query":{
        "bool": {
            "must": [{
                "match": {
                    "name": "zs"
                }
            }],
            
            "filter": [
                {
                    "range":{   //范围查询
                        "age":{
                            "gte":18,
                            "lte":20
                        }
                    }
                },
                {
                    "term": {   //词元查询
                        "sex": 1
                    }
                }
            ]
        }
    },
    "from": 1,
    "size": 10,
    "_source": ["id", "name", "age","username"],
    "sort": [{
        "age": "desc"
    }]
}

7.分词器安装和使用

7.1 什么是分词

在全文检索理论中,文档的查询是通过关键字查询文档索引来进行匹配,因此将文本拆分为有意义的单词,对于搜索结果的准确性至关重要,因此,在建立索引的过程中和分析搜索语句的过程中都需要对文本串分词。ES的倒排索引是分词的结果。

7.2 安装IK分词器

插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik

7.3 分词器配置

在ik/config 目录可以对分词器进行配置,如停词 , 自定义字典等。

7.4 IK分词测试

POST _analyze
{
  "analyzer":"ik_smart",
  "text":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"
}

8.JavaApi操作ES

8.1 集成ES

官方文档API:Java Transport Client (deprecated) | Elastic

8.2 导入依赖

 <parent>
    <groupId> org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>
  </dependencies>

8.3 yml配置

server:
  port: 1000
spring:
  elasticsearch:
    rest:
      uris:
        - http://localhost:9200

8.4 编写启动类

@SpringBootApplication
public class SearchStart{
    public static void main( String[] args ){
        SpringApplication.run(SearchStart.class);
    }
}

8.5 创建Document对象

@Document(indexName = "order",type = "_doc")
@Data
public class OrderDoc {
    // 指定为文档id
    @Id
    private Long id;

    // 指定为Text类型 - 要分词,使用ik分词器 (analyzer - 索引分词器  searchAnalyzer - 搜索分词器)
    @Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String title;

    // 指定为Keyword类型 - 不分词
    @Field(type = FieldType.Keyword)
    private String name;

    @Field(type = FieldType.Double)
    private BigDecimal price;

    @Field(type = FieldType.Integer)
    private int count;

    @Field(type = FieldType.Integer)
    private int status;

    @Field(type = FieldType.Date)
    private Date createTime;
}

8.6 创建Repository

@Repository
public interface OrderRepository extends ElasticsearchRepository<OrderDoc,Long> {
}

这里的泛型是当前Repository所要管理的实体类,也就是OrderDoc,Long是实体类ID的类型

8.7 测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class OrderTest {

    @Autowired
    private ElasticsearchRestTemplate template;

    @Autowired
    private OrderRepository repository;

    @Test
    public void esTest() throws Exception {
        // 创建索引
        boolean index = template.createIndex(OrderDoc.class);
        System.out.println(index);
        // 创建映射
        index = template.putMapping(OrderDoc.class);
        System.out.println(index);
    }

    @Test
    public void addTest() throws Exception {
        OrderDoc orderDoc = new OrderDoc();
        orderDoc.setId(3L);
        orderDoc.setName("小手一摊");
        orderDoc.setCount(10);
        orderDoc.setStatus(3);
        orderDoc.setCreateTime(new Date());
        orderDoc.setTitle("与我无关");
        orderDoc.setPrice(new BigDecimal(328));

        // 添加
        repository.save(orderDoc);

        Optional<OrderDoc> optional = repository.findById(1L);
        System.out.println(optional.get());

        repository.deleteById(2L);
    }

    @Test
    public void updateTest() throws Exception {
        Optional<OrderDoc> optional = repository.findById(2L);
        OrderDoc orderDoc = optional.get();
        orderDoc.setName("氪金才能变强");
        repository.save(orderDoc);

        optional = repository.findById(2L);
        System.out.println(optional.get());
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WuKong 全文搜索引擎。功能特性:高效索引和搜索(1M条微博500M数据28秒索引完,1.65毫秒搜索响应时间,19K搜索QPS)支持中文分词(使用sego分词包并发分词,速度27MB/秒)支持计算关键词在文本中的紧邻距离(token proximity)支持计算BM25相关度支持自定义评分字段和评分规则支持在线添加、删除索引支持持久存储可实现分布式索引和搜索采用对商业应用友好的Apache License v2发布示例代码:package main import (     "github.com/huichen/wukong/engine"     "github.com/huichen/wukong/types"     "log" ) var (     // searcher是协程安全的     searcher = engine.Engine{} ) func main() {     // 初始化     searcher.Init(types.EngineInitOptions{         SegmenterDictionaries: "github.com/huichen/wukong/data/dictionary.txt"})     defer searcher.Close()     // 将文档加入索引     searcher.IndexDocument(0, types.DocumentIndexData{Content: "此次百度收购将成中国互联网最大并购"})     searcher.IndexDocument(1, types.DocumentIndexData{Content: "百度宣布拟全资收购91无线业务"})     searcher.IndexDocument(2, types.DocumentIndexData{Content: "百度是中国最大的搜索引擎"})     // 等待索引刷新完毕     searcher.FlushIndex()     // 搜索输出格式见types.SearchResponse结构体     log.Print(searcher.Search(types.SearchRequest{Text:"百度中国"})) } 标签:WuKongSearch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值