全文检索细说
搜索方案,如何实现?采用什么技术和策略?
全文检索思想
全文搜索就是对文本数据的一种索引(分词索引,并非数据库索引)搜索方式。
全文搜索特点,
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
创建文档索引
获取文档
更新文档