ElasticSearch全文搜索引擎

ElasticSearch全文搜索引擎


前言

全文搜索引擎在很多领域都有广泛的应用,包括互联网搜索引擎、企业搜索、内容管理系统、电子邮件搜索、日志分析等


一、全文搜索Lucene

1.Lucene是什么?

Lucene是apache下的一个开源的全文检索引擎工具包(一堆jar包)。它为软件开发人员提供一个简单易用的工具包(类库),以方便的在小型目标系统中实现全文检索的功能

2.Lucene索引原理

核心:索引创建,索引搜索
Lucene全文搜索的执行流程,如下图:

索引创建:

在这里插入图片描述
在①处分别为3个句子加上编号,然后使用分词器进行分词,把被一个单词分解出来与编号对应放在②处;按规则统一变为小写放在③处;要加快搜索速度,就必须保证这些单词的排列时有一定规则,这里按照字母顺序排列后放在④处;最后简化索引,合并相同的索引,就得到如下结果:【倒排索引文档】
在这里插入图片描述
索引搜索:
处理用户的查询请求,搜索索引库中的的索引,然后返回结果的过程

返回的结果会进行相关性排序,原始数据中包含的搜索的索引越多,权重越重,排名就在最前面

二、ElasticSearch全文搜索引擎

1.什么是ElasticSearch?

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

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

2.ES的特点:

  • 分布式的实时文件存储

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

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

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

  • 处理PB级结构化或非结构化数据

  • 简单的 RESTful API通信方式

  • 支持各种语言的客户端

  • 基于Lucene封装,使操作简单

3.ES和lucene的区别:

  • Lucene只支持Java,ES支持多种语言

  • Lucene非分布式,ES支持分布式

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

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

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

Elasticsearch 是建立在 Lucene 基础之上的分布式搜索和分析引擎,相对于 Lucene 具有更强大的功能、更好的性能和更丰富的生态系统。而 Lucene 则是一个更轻量级的全文搜索库,适用于一些简单的单机搜索场景

4.其他全文搜索引擎

  • Solr:Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如Word、PDF)的处理。Solr是高度可扩展的,并提供了分布式搜索和索引复制。Solr是最流行的企业级搜索引擎,Solr4 还增加了NoSQL支持
  • Solr和ES比较
    Solr 利用 Zookeeper(注册中心) 进行分布式管理,支持更多格式的数据(HTML/PDF/CSV),官方提供的功能更多在传统的搜索应用中表现好于 ES,但实时搜索效率低。

ES自身带有分布式协调管理功能,但仅支持json文件格式,本身更注重于核心功能,高级功能多有第三方插件提供,在处理实时搜索应用时效率明显高于 ES。

5.ES下载,安装,以及使用

ES下载:https://www.elastic.co/downloads/elasticsearch
ES安装:解压即可使用
ES启动:双击安装目录 bin/elasticsearch.bat => 可以通过修改 jvm.options 文件来修改内存

使用:Kibana5一个基于 Web 的开源数据可视化工具,用于展示、分析和交互式查询 Elasticsearch 中的数据。
Kibana5下载:https://www.elastic.co/downloads/kibana => 版本要与ES一致,避免版本冲突
Kibana5安装:解压即可安装
Kinbana连接ES配置:编辑config/kibana.yml,设置elasticsearch.url: “http://localhost:9200”
Kibana5启动:双击bin\kibana.bat
Kibana5使用:浏览器访问 http://localhost:5601,对es进行操作

6.ElasticSearch基础

  • 基本概念:
    Near Realtime:近实时,两个意思,从写入数据到数据可以被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析可以达到秒级
    Index:索引库
    Type:类型
    Document&field:文档,es中的最小数据单元
  • 索引库CRUD
    增加索引库:默认设置5个Master Shard分片,每个Master Shard分片有1个Replica Shard从分片 PUT index
    查询索引库:
    查询所有索引库 GET _cat/indices
    查询指定索引库 GET _cat/indices/type
    删除索引库:
    DELETE 名字
  • 文档的CRUD
    添加文档:

代码如下(示例):

	PUT /索引库/类型/id
	{
		json格式
	}

注意:如果不指定文档的id,ES会自动生成文档id

获取文档:

代码如下(示例):

	获取指定文档:  GET  /索引库/类型/id
	指定返回的列:  GET  /索引库/类型/id?_source=字段名
	只要内容不要元数据: GET  /索引库/类型/id/_source

修改文档:

代码如下(示例):

	整体修改: 会用最新的数据覆盖以前的所有数据
	PUT /索引库/类型/id
	{
		json格式
	}
	局部修改: 只修改局部数据
	POST /索引库/类型/id/_update
	{
		"doc"{
			要修改的数据
		}
	}

删除文档:

代码如下(示例):

	DELETE  /索引库/类型/id
  • 文档简单查询:

代码如下(示例):

	查询所有:GET _search
	
	查询指定索引库: GET /index/_search
	
	查询指定类型:GET /index/type/_search
	
	查询指定文档:GET /index/type/id

	分页查询:&from=2&size=2

7.DSL查询与DSL过滤

  • 什么是DSL查询?
    DSL查询是由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。DSL有两部分组成:DSL查询和DSL过滤。
  • .DSL查询语法:

代码如下(示例):

	GET /index/type/_search
	{
		“query”{
			"match_all":{} //查询所有数据
		},
		"from": ,  //从第几条数据开始查
		"size": , //分页显示条数
		"_source":[], //查询那几个列的数据
		"sort":[] //排序
	}
	
  • DSL过滤:

    DSL过滤和DSL查询在性能上的区别:
    过滤结果可以缓存并应用到后续请求。
    查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。
    过滤语句可有效地配合查询语句完成文档过滤

  • DSL查询+过滤语法:

代码如下(示例):

	GET /index/type/_search
	{
		"query"{ //  查询,所有的查询条件在query里面
			"bool"{ // 组合搜索bool可以组合多个查询条件为一个查询对象,这里包含了 DSL查询和DSL过滤的条件
				"must":{ // 必须匹配 :与(must) 或(should) 非(must_not)
					"match":{ // 分词匹配查询,会对查询条件分词 , multi_match :多字段匹配
						"username":"hello word"
					}
				},
				"filter":{ // 过滤
					"term":{  // 词元查询,不会对查询条件分词
					   "username":"zf ls"
					}
				}
			
			}
			"match_all":{} //查询所有数据
		},
		"from": ,  //从第几条数据开始查
		"size": , //分页显示条数
		"_source":[], //查询那几个列的数据
		"sort":[] //排序
	}
	
  • 查询方式:
    全匹配(match_all):匹配所有文档
    标准查询(match和multi_match):标准查询,会对查询的内容进行分词后,得到多个单词,分别带着多个单词去检索ESs索引库,只要有一个单词能查出结果,整个查询就有结果
    单词搜索与过滤(Term和Terms):单词/词元查询 , 可以理解为等值查询,字符串,数字等都可以使用它,不会分词,将查询索引看做一个整体
    组合条件搜索与过滤(Bool):组合搜索bool可以组合多个查询条件为一个查询对象
    范围查询与过滤(range):range过滤允许我们按照指定范围查找一批数据,如: “range”:{gt:值,lt:值 }
    前匹配搜索与过滤(prefix):匹配前缀
    通配符搜索(wildcard):使用*代表0~N个,使用?代表1个,如:“name”:“李?四”

8.文档类型映射

  • 什么是文档映射?
    ES的文档映射(mapping)机制用于进行字段类型确认,将每个字段匹配为一种确定的数据类型
  • 创建映射:

代码如下(示例):

	PUT index
	{
		"mappings":{
			"_doc":{
				"properties":{
					"id"{
						"type":"inteeger"
					},
					"info":{
						"type":"text",
						"analyzer":"ik_smart",
						"searchAnalyzer":"ik_smart"
					}
				}
			}
		}
	}
	

总结

例如:以上就是今天要讲的内容,本文仅仅简单介绍了全文搜索引擎和ElasticSearch全文搜索引擎的使用。

  • 3
    点赞
  • 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、付费专栏及课程。

余额充值