全文检索细说

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

全文检索思想

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

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

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

下降数据库压力,提升查询速度。json

全文搜索的核心
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

建立文档索引

获取文档

更新文档

相关文章
相关标签/搜索