SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
搜索技术分享
大纲
•
•
•
•

一.搜索方案介绍
二.中文分词介绍
三.Lucene介绍
四.Elasticsearch实战
一.搜索方案介绍
• 1.SolrCloud
• 2.Elasticsearch
Solrcloud
• 分布式搜索解决方案。通过zookeeper来实现高
可靠,高可用性。
• 特色:
• 1.集中式的配置信息
• 2.自动容错
• 3.近实时搜索
• 4.查询时自动负载均衡
• 5自动分发的索引和索引分片
• 6.事务日志
Elasticsearch
•
•
•
•
•
•
•
•

Full Text Search Engine
Distributed, (Near) Real Time, Search Engine
RESTful,JSON,HTTP,Easy To Debug
Scalable,From One Node To One Thousand
Node
High Availability
Good Extensibility
Rich Search Features
Good Extensibility
Solrcloud VS Elasticsearch
• Elasticsearch性能明显要好于solrcloud(查询
和建立索引)建立索引:
solrcloud(http),elasticesearch(tcp)
• Elasticsearch配置更容易,操作方便
• Elasticsearch资料相对较少,复杂问题需要查
看源码。Solr相对比较成熟,资料较多。
Elasticsearch应用案例
• Foursquare每天5000万实时请求查询
• SoundCloud在线分布式声音平台提供给1.8
亿人服务
• GitHub 使用Elasticsearch搜索20TB数据,包
括13亿文件和1300亿行代码
• fog creek使用Elasticsearch每月提供3000万
次用户请求,通过搜索400亿行代码提供结
果。
二.中文分词介绍
• 中文分词有三种方法
• 1.基于字典、词库匹配的分词方法(机械分
词)---常用的方法
• 2.基于词频度统计的分词方法(统计学)
• 3.基于知识理解的分词方法(语义分析)。
基于字典、词库匹配的分词方法
•
•
•
•

1)正向最大匹配法(由左到右的方向)
2)逆向最大匹配法(由右到左的方向)
3)最少切分(使每一句中切出的词数最小)
4) 双向匹配法:将正向最大匹配法与逆向最
大匹配法组合。
Lucene中文分词器
• mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法
(http://technology.chtsai.org/mmseg/ )实现
的中文分词器
• Paoding https://code.google.com/p/paoding/
• IK Analyzer https://code.google.com/p/ikanalyzer/
• Imdict https://code.google.com/p/imdictchinese-analyzer/
三.Lucene介绍
• Lucene 是一个基于 Java 的全文信息检索工
具包,它不是一个完整的搜索应用程序,
而是为你的应用程序提供索引和搜索功能。
索引
• 我们生活中的数据总体分为两种:结构化
数据 和非结构化数据 。
• 结构化数据: 指具有固定格式或有限长度
的数据,如数据库,元数据等。
• 非结构化数据: 指不定长或无固定格式的
数据,如邮件,word文档等。
• 非结构化数据又叫全文数据。
索引
对非结构化数据也即对全文数据的搜索主有两种
方法:
顺序扫描法 (Serial Scanning)
适合小文件搜索和数据量不大时。
索引
从非结构化数据中提取出然后重新组织的信息
先建立索引,再对索引进行搜索的过程就叫全文
检索(Full-text Search)
Lucene检索过程
反向索引
• 由于从字符串到文件的映射是文件到字符
串映射的反向过程,于是保存这种信息的
索引称为反向索引
• 假设我的文档集合里面有100篇文档,为了
方便表示,我们为文档编号从1到100,得
到下面的结构
词典﹑倒排表
• 左边保存的是一系列字符串,称为词典 。
• 每个字符串都指向包含此字符串的文档
(Document)链表,此文档链表称为倒排
表 (Posting List)。
• 有了索引,使保存的信息和要搜索的信息一
致,可以大大加快搜索的速度。
• 我们要寻找既包含字符串“lucene”又包含
字符串“solr”的文档,我们只需要以下几
步:
• 1. 取出包含字符串“lucene”的文档链表。
• 2. 取出包含字符串“solr”的文档链表。
• 3. 通过合并链表,找出既包含“lucene”又
包含“solr”的文件。
一次索引,多次使用
• 看到这个地方,有人可能会说,全文检索的确
加快了搜索的速度,但是多了索引的过程,两
者加起来不一定比顺序扫描快多少。的确,加
上索引的过程,全文检索不一定比顺序扫描快,
尤其是在数据量小的时候更是如此。而对一个
很大量的数据创建索引也是一个很慢的过程。
• 顺序扫描是每次都要扫描,而创建索引的过程
仅仅需要一次,以后便是一劳永逸的了,每次
搜索,创建索引的过程不必经过,仅仅搜索创
建好的索引就可以了。
四.Elasticsearch实战
安装
•
•
•
•
•

零配置,开箱即用
没有繁琐的安装配置
各版本下载地址:
http://www.elasticsearch.org/download
wget
http://download.elasticsearch.org/elasticsearch
/elasticsearch/elasticsearch-0.90.5.zip
• unzip elasticsearch-0.90.5.zip
• cd elasticsearch-0.20.2/bin
• ./elasticsearch
安装中文分词插件
• https://github.com/medcl/elasticsearchanalysis-ik
• 或https://github.com/awnuxkjy/es-ik
• 下载后,用maven 进行编译.得到jar包放到
plugin目录下的ik目录。
• 修改config/elasticsearch.yml
Elasticsearch.yml
确认ES正常运行
•
•
•
•
•
•
•
•
•
•

http,9200端口是否监听
–netstat –ano|grep 9200
es通讯端口9300端口是否监听
–netstat –ano|grep 9300
如果使用了thrift,确认9500端口是否监听
–netstat –ano|grep 9500
查看ES进程
–ps –aux|grep elasticsearch
通过elasticsearch-wrapper来查看
–/etc/init.d/elasticsearch status
查看ES版本信息
• curl http://localhost:9200
• {
–
–
–
–
–
–
–
–

• }

"ok" : true,
"status" : 200,
"name" : "Captain Savage",
"version" : {
"number" : "0.90.1",
"snapshot_build" : false
},
"tagline" : "You Know, for Search"
创建索引
• 操作流程
• 1.准备索引文档
json格式
自己拼json格式
使用第三方插件,如jdbc river
注意验证json格式有效性

• 2.提交文档到es
– index
– bulk

• 3.返回操作结果
• 成功或者失败
mapping
Index 、Type、 Doc
• Doc
–索引文档,你的数据
• Index
–索引库
–物理隔离
• Type
–索引类型
–同类型数据
ES索引Java代码
构造查询
• 查询流程
• 1.构造查询条件
lucene查询语法
QueryDSL查询表达式
• 2.提交给elasticsearch
• 3.返回搜索结果
Query the document
lucene查询语法
• 关键字:+ - && || ! ( ) { } [ ] ^ " ~ * ? : 
–如果所要查询的查询词中本身包含关键字,则需
要用进行转义
• 查询词(Term)
–Lucene支持两种查询词,一种是单一查询词,
如"hello",一种是词组(phrase),如"hello world"。
• 查询域(Field)
–在查询语句中,可以指定从哪个域中寻找查询词,
如果不指定,则从默认域中查找。
–查询域和查询词之间用:分隔,如title:"Do it right"。
lucene查询语法
• 通配符查询(Wildcard)
–支持两种通配符:?表示一个字符,*表示
多个字符。
–通配符可以出现在查询词的中间或者末尾,
如te?t,test*,te*t,但决不能出现在开始,
如*test,?test。性能低下!
–模糊查询(Fuzzy)
• 模糊查询的算法是基于Levenshtein Distance,
也即当两个词的差别小于某个比例的时候,就
算匹配,如roam~0.8,即表示差别小于0.2,相
似度大于0.8才算匹配。
lucene查询语法
• 临近查询(Proximity)
–在词组后面跟随~10,表示词组中的多个词之间的距离
之和不超过10,则满足查询。
–所谓词之间的距离,即查询词组中词为满足和目标词
组相同的最小移动次数。
–如索引中有词组"apple boy cat"。
–如果查询词为"apple boy cat"~0,则匹配。
–如果查询词为"boy apple cat"~2,距离设为2方能匹配,
设为1则不能匹配。
–如果查询词为"cat boy apple"~4,距离设为4方能匹配。
lucene查询语法
• 区间查询(Range)
–区间查询包含两种,一种是包含边界,用[A TO B]指
定,一种是不包含边界,用{A TO B}指定。
–如date:[20020101 TO 20030101],当然区间查询不仅
仅用于时间,如title:{Aida TO Carmen}
• 设置查询词的权重(Boost)
–可以在查询词后面加^N来设定此查询词的权重,默认
是1,如果N大于1,则说明此查询词更重要,如果N小
于1,则说明此查询词更不重要。
–如jakarta^4 apache,"jakarta apache"^4 "Apache
Lucene"
lucene查询语法
• 布尔操作符(Boolean Operators)
–布尔操作符包括连接符,如AND,OR,和修
饰符,如NOT,+,-。
–默认状态下,空格被认为是OR的关系,
QueryParser.setDefaultOperator(Operator.AND)
设置为空格为AND。
–
+表示一个查询语句是必须满足的
(required),NOT和-表示一个查询语句是不能满
足的(prohibited)。
lucene查询语法
• 灵活组合,支持级联
–可以用括号,将查询语句进行组合,从而设定优先级。
• 如(jakarta OR apache) AND website
–字段组合,将多个条件组合到一个字段域下面
• 如title:(+return +"pink panther")
–Lucene的查询语法是由QueryParser来进行解析,从而生成查询
对象的。
–通过编译原理我们知道,解析一个语法表达式,需要经过词法
分析和语法分析的过程,也即需要词法分析器和语法分析器。
–QueryParser是通过JavaCC来生成词法分析器和语法分析器的。
Query
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

Match
multi_match
bool
boosting
ids
custom_score
custom_boost_factor
constant_score
dis_max
field
filtered
flt
flt_field
fuzzy
has_child

match_all
mlt
Filters
Queries vs Filters

●full text & terms
●relevance scoring
●slower
●no caching

●terms only
●no scoring
●faster
●cacheable
支持的客户端
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

ElasticSearch.pm: Perl client.
pyes: Python client.
Tire: Ruby API & DSL, with ActiveRecord/ActiveModel integration.
Elastica: PHP client.
rubberband: Ruby client.
em-elasticsearch: elasticsearch library for eventmachine.
elastic_searchable: Ruby client + Rails integration.
erlastic_search: Erlang client.
elasticsearch PHP client.
PlainElastic.Net: .NET client.
NEST: .NET client.
ElasticSearch.NET: .NET client.
pyelasticsearch: Python client.
Elastisch: Clojure client.
ESClient: A lightweight and easy to use Python client for ElasticSearch
scalastic: Scala client
rawes: Python low level client
JAVA-API
Maven repositories
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${es.version}</version>
</dependency>
Client-类型
• Node Client
–客户端节点本身也是elasticsearch节点
–也加入集群,和其它elasticsearch节点一样
–升级维护麻烦(词库,配置等等)
• TransportClient
–更加轻量级
–客户端socket连接到es集群
–Netty线程池
TransportClient

Contenu connexe

Tendances

全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用
建興 王
 

Tendances (20)

Spark sql培训
Spark sql培训Spark sql培训
Spark sql培训
 
全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用全文搜尋引擎的進階實作與應用
全文搜尋引擎的進階實作與應用
 
CH16:整合資料庫
CH16:整合資料庫CH16:整合資料庫
CH16:整合資料庫
 
Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南Coreseek/Sphinx 全文检索实践指南
Coreseek/Sphinx 全文检索实践指南
 
CH04:認識物件
CH04:認識物件CH04:認識物件
CH04:認識物件
 
CH09:Collection與Map
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與Map
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Xapian介绍
Xapian介绍Xapian介绍
Xapian介绍
 
搜索引擎技术介绍
搜索引擎技术介绍搜索引擎技术介绍
搜索引擎技术介绍
 
Introduction to big data
Introduction to big dataIntroduction to big data
Introduction to big data
 
COSCUP 2016 Workshop : 快快樂樂學Neo4j
COSCUP 2016 Workshop : 快快樂樂學Neo4jCOSCUP 2016 Workshop : 快快樂樂學Neo4j
COSCUP 2016 Workshop : 快快樂樂學Neo4j
 
陽明大學/FHIR 快速跳坑指南
陽明大學/FHIR 快速跳坑指南陽明大學/FHIR 快速跳坑指南
陽明大學/FHIR 快速跳坑指南
 
Oracle 索引介紹
Oracle 索引介紹Oracle 索引介紹
Oracle 索引介紹
 
ELK Stack - Kibana操作實務
ELK Stack - Kibana操作實務ELK Stack - Kibana操作實務
ELK Stack - Kibana操作實務
 
Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論Java SE 8 技術手冊第 1 章 - Java平台概論
Java SE 8 技術手冊第 1 章 - Java平台概論
 
北護大/FHIR 開發簡介與應用
北護大/FHIR 開發簡介與應用北護大/FHIR 開發簡介與應用
北護大/FHIR 開發簡介與應用
 
FHIR Server 安裝與使用
FHIR Server 安裝與使用FHIR Server 安裝與使用
FHIR Server 安裝與使用
 
中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本中正大學/FHIR 快速掃描 R4 版本
中正大學/FHIR 快速掃描 R4 版本
 
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
 
CH02:從JDK到IDE
CH02:從JDK到IDECH02:從JDK到IDE
CH02:從JDK到IDE
 

Similaire à 搜索技术分享

scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎
Ping Yin
 
第五章-2
第五章-2第五章-2
第五章-2
jxhtq
 
第四章
第四章第四章
第四章
jxhtq
 
Itpub电子杂志第四期第二稿
Itpub电子杂志第四期第二稿Itpub电子杂志第四期第二稿
Itpub电子杂志第四期第二稿
yiditushe
 
圖書館資源探索系統 學會研習班
圖書館資源探索系統 學會研習班圖書館資源探索系統 學會研習班
圖書館資源探索系統 學會研習班
皓仁 柯
 
Lucene漫谈
Lucene漫谈Lucene漫谈
Lucene漫谈
Zek Chang
 

Similaire à 搜索技术分享 (20)

elastic search分析与实践
elastic search分析与实践elastic search分析与实践
elastic search分析与实践
 
Lucene实践
Lucene实践Lucene实践
Lucene实践
 
Java 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - LuceneJava 的開放原碼全文搜尋技術 - Lucene
Java 的開放原碼全文搜尋技術 - Lucene
 
Json ld 簡介
Json ld 簡介Json ld 簡介
Json ld 簡介
 
Information Retrieval
Information RetrievalInformation Retrieval
Information Retrieval
 
scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎scrapy+sphinx搭建搜索引擎
scrapy+sphinx搭建搜索引擎
 
Sphinx 全文检索实践指南
Sphinx 全文检索实践指南Sphinx 全文检索实践指南
Sphinx 全文检索实践指南
 
資源探索服務之功能評估指標
資源探索服務之功能評估指標資源探索服務之功能評估指標
資源探索服務之功能評估指標
 
ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1ElasticSearch Training#2 (advanced concepts)-ESCC#1
ElasticSearch Training#2 (advanced concepts)-ESCC#1
 
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTLServlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
Servlet & JSP 教學手冊第二版 - 第 7 章:使用 JSTL
 
Nosql三步曲
Nosql三步曲Nosql三步曲
Nosql三步曲
 
第五章-2
第五章-2第五章-2
第五章-2
 
Ajax Lucence
Ajax LucenceAjax Lucence
Ajax Lucence
 
Azure Data Lake 簡介
Azure Data Lake 簡介Azure Data Lake 簡介
Azure Data Lake 簡介
 
第四章
第四章第四章
第四章
 
理解和利用关联数据 --图情档博(LAM)作为关联数据的提供者和消费者
理解和利用关联数据 --图情档博(LAM)作为关联数据的提供者和消费者理解和利用关联数据 --图情档博(LAM)作为关联数据的提供者和消费者
理解和利用关联数据 --图情档博(LAM)作为关联数据的提供者和消费者
 
1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计1到100000000 - 分布式大型网站的架构设计
1到100000000 - 分布式大型网站的架构设计
 
Itpub电子杂志第四期第二稿
Itpub电子杂志第四期第二稿Itpub电子杂志第四期第二稿
Itpub电子杂志第四期第二稿
 
圖書館資源探索系統 學會研習班
圖書館資源探索系統 學會研習班圖書館資源探索系統 學會研習班
圖書館資源探索系統 學會研習班
 
Lucene漫谈
Lucene漫谈Lucene漫谈
Lucene漫谈
 

搜索技术分享