全文检索细说

搜索方案,如何实现?采用什么技术和策略?

全文检索思想

全文搜索就是对文本数据的一种索引(分词索引,并非数据库索引)搜索方式。

全文搜索特点,
1.做相关度排序
2.对文本中的关键字做高亮显示
3.基于单词进行搜索
4.只关注文本,不考虑语义

使用场景,替换模糊查询。
模糊查询缺点:查询速度慢,没有相关度排序,没有文本高亮显示,没有摘要截取,搜索效果不好。

降低数据库压力,提高查询速度。

全文搜索的核心
1.创建索引(建立关键字与文本之间的关联关系。通过单词查询到句子对应的编号。)
分词-->语法处理-->去重-->排序
2.搜索索引
输入关键字-->关键字分词-->搜索得到具体编号-->通过编号获取句子-->封装对象展示到前台

全文检索的一种实现?Lucene

Lucene是全文检索的一种实现,一堆jar包。

中小应用:Lucene(也能使用ES)
大型应用:Elastic Search,Sorl

核心API
索引库中
增删改:IndexWriter
查:IndexSearcher

使用过程,下载,导入jar包,测试使用。

看视频,看思想!

Overview查看分词情况,Documents查看Doc记录,Search进行查询。

索引目录(Directory)就是存储索引文件目录的对象,里面存放索引文件。

底层的东西,是科学家研究的。有些算法,不是常人能看懂的。

分词,包括中文分词,英文分词,中英文结合分词。
一堆Api接口中,我们只需要自己需要的。
有些老外写的玩意儿,不一定很友好。

分词的时候,去除停止词,增加一些扩展词。
可以控制力度。分词的大小。

Document是一个动态列。一个Document对象可以随意的添加很多列。

需要存,需要分词,需要索引,需要查询的(标题,摘要,产品名称)

需要存,但不需要索引,不需要查询的(路径)

需要存,不需要分词,需要查询的(ID,人名,地名)

不需要存,需要分词,需要索引,需要查询(文章,大字段)

是否存储,是否索引,是否分词。(ik分词器)

Document随着数据库的改变而改变。一个Document对应一个文章或者商品信息(id,title,desc,属性,规格,分类等),或店铺信息。

先思想,后实践,再解释。从了解,到入门,到精通。

用的最多的是容错查询!模糊查询!

ES(Elastic Search)全文检索服务器

Lucene只能用Java,使用负杂。不支持集群环境(索引数据不同步)。
这个时候ES就诞生了。
大型项目都是需要集群的。

ES,实时文件存储。
可以扩展到上百台服务器,处理PB级结构化或非结构化数据。
高度集成化的服务,可以通过RESTfulAPI,各种语言的客户端,甚至命令行与之交互。

ES封装了Lucene,使用变得更简单。

ES,都是http请求。Lucene都是调用API执行操作。

ES使用案例(GitHub)

重量级对手,Solr。

服务端,客户端。RESTful。(图解,剖析架构),使用json作为数据交换格式。

如何使用?

1.安装ES服务端
2.了解Restful风格
3.选择图形界面客服端
4.使用图形客户端向服务器发送各种命令
5.使用java,php客户端语言操作ES服务器,增删改查

依赖JDK1.7+

图形界面访问9200端口,代码端访问9300端口。

DSL查询与过滤

由ES提供的丰富灵活的查询语言。

DSL查询,DSL过滤。

DSL过滤是精确查询。

DSL查询是模糊查询。

通过JSON来处理复杂的查询条件。

理解知识体系,以后使用的时候,查询手册就可以了。

分词器,需要通过插件进行集成。在服务器端进行集成。(IK分词器)

文档映射机制用于进行字段类型确认(字段是什么类型,哪个分词器),将每个字段匹配为一种确定的数据类型。

字符串,数字,日期,逻辑。

对象类型,数组类型,地理位置。

如果不指定类型,它会有自己默认的类型。

自定义映射包括设置:
1.类型
2.是否可索引,可过滤
3.权重
4.格式
5.长度,大于该值的字符串将不会被索引和存储
6.是否将该值加到_all中
7.是否存储
8.索引方式,索引并分词,索引不分词,不索引
9.索引分词器,索引创建时使用的分词器,ik_smart,ik_max_word,standard
10.搜索分词器,搜索该字段的值时,传入的查询内容的分词器

自定义高于全局,全局高于默认。

最佳实践

1.配置全局动态模板映射
2.创建索引库
3.配置字段映射
4.创建、更新、删除文档
5.搜索

连接ES

创建文档索引

获取文档

更新文档

原文地址:https://www.cnblogs.com/jiqing9006/p/9248410.html