搜索技术分享
大纲
•
•
•
•

一.搜索方案介绍
二.中文分词介绍
三.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...
Solrcloud VS Elasticsearch
• Elasticsearch性能明显要好于solrcloud(查询
和建立索引)建立索引:
solrcloud(http),elasticesearch(tcp)
• Elasticsea...
Elasticsearch应用案例
• Foursquare每天5000万实时请求查询
• SoundCloud在线分布式声音平台提供给1.8
亿人服务
• GitHub 使用Elasticsearch搜索20TB数据,包
括13亿文件和130...
二.中文分词介绍
• 中文分词有三种方法
• 1.基于字典、词库匹配的分词方法(机械分
词)---常用的方法
• 2.基于词频度统计的分词方法(统计学)
• 3.基于知识理解的分词方法(语义分析)。
基于字典、词库匹配的分词方法
•
•
•
•

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

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

http,9200端口是否监听
–netstat –ano|grep 9200
es通讯端口9300端口是否监听
–netstat –ano|grep 9300
如果使用了thrift...
查看ES版本信息
• curl http://localhost:9200
• {
–
–
–
–
–
–
–
–

• }

"ok" : true,
"status" : 200,
"name" : "Captain Savage",
"v...
创建索引
• 操作流程
• 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支持两种查询词,一种是单一查询词,
如...
lucene查询语法
• 通配符查询(Wildcard)
–支持两种通配符:?表示一个字符,*表示
多个字符。
–通配符可以出现在查询词的中间或者末尾,
如te?t,test*,te*t,但决不能出现在开始,
如*test,?test。性能低下...
lucene查询语法
• 临近查询(Proximity)
–在词组后面跟随~10,表示词组中的多个词之间的距离
之和不超过10,则满足查询。
–所谓词之间的距离,即查询词组中词为满足和目标词
组相同的最小移动次数。
–如索引中有词组"apple...
lucene查询语法
• 区间查询(Range)
–区间查询包含两种,一种是包含边界,用[A TO B]指
定,一种是不包含边界,用{A TO B}指定。
–如date:[20020101 TO 20030101],当然区间查询不仅
仅用于时间...
lucene查询语法
• 布尔操作符(Boolean Operators)
–布尔操作符包括连接符,如AND,OR,和修
饰符,如NOT,+,-。
–默认状态下,空格被认为是OR的关系,
QueryParser.setDefaultOperat...
lucene查询语法
• 灵活组合,支持级联
–可以用括号,将查询语句进行组合,从而设定优先级。
• 如(jakarta OR apache) AND website
–字段组合,将多个条件组合到一个字段域下面
• 如title:(+retur...
Query
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•

Match
multi_match
bool
boosting
ids
custom_score
custom_boost_factor
constant_score
d...
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 A...
JAVA-API
Maven repositories
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${es....
Client-类型
• Node Client
–客户端节点本身也是elasticsearch节点
–也加入集群,和其它elasticsearch节点一样
–升级维护麻烦(词库,配置等等)
• TransportClient
–更加轻量级
–客...
TransportClient
搜索技术分享
搜索技术分享
搜索技术分享
搜索技术分享
搜索技术分享
搜索技术分享
Upcoming SlideShare
Loading in …5
×

搜索技术分享

1,128 views

Published on

Published in: Technology, News & Politics
  • Be the first to comment

搜索技术分享

  1. 1. 搜索技术分享
  2. 2. 大纲 • • • • 一.搜索方案介绍 二.中文分词介绍 三.Lucene介绍 四.Elasticsearch实战
  3. 3. 一.搜索方案介绍 • 1.SolrCloud • 2.Elasticsearch
  4. 4. Solrcloud • 分布式搜索解决方案。通过zookeeper来实现高 可靠,高可用性。 • 特色: • 1.集中式的配置信息 • 2.自动容错 • 3.近实时搜索 • 4.查询时自动负载均衡 • 5自动分发的索引和索引分片 • 6.事务日志
  5. 5. 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
  6. 6. Solrcloud VS Elasticsearch • Elasticsearch性能明显要好于solrcloud(查询 和建立索引)建立索引: solrcloud(http),elasticesearch(tcp) • Elasticsearch配置更容易,操作方便 • Elasticsearch资料相对较少,复杂问题需要查 看源码。Solr相对比较成熟,资料较多。
  7. 7. Elasticsearch应用案例 • Foursquare每天5000万实时请求查询 • SoundCloud在线分布式声音平台提供给1.8 亿人服务 • GitHub 使用Elasticsearch搜索20TB数据,包 括13亿文件和1300亿行代码 • fog creek使用Elasticsearch每月提供3000万 次用户请求,通过搜索400亿行代码提供结 果。
  8. 8. 二.中文分词介绍 • 中文分词有三种方法 • 1.基于字典、词库匹配的分词方法(机械分 词)---常用的方法 • 2.基于词频度统计的分词方法(统计学) • 3.基于知识理解的分词方法(语义分析)。
  9. 9. 基于字典、词库匹配的分词方法 • • • • 1)正向最大匹配法(由左到右的方向) 2)逆向最大匹配法(由右到左的方向) 3)最少切分(使每一句中切出的词数最小) 4) 双向匹配法:将正向最大匹配法与逆向最 大匹配法组合。
  10. 10. 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/
  11. 11. 三.Lucene介绍 • Lucene 是一个基于 Java 的全文信息检索工 具包,它不是一个完整的搜索应用程序, 而是为你的应用程序提供索引和搜索功能。
  12. 12. 索引 • 我们生活中的数据总体分为两种:结构化 数据 和非结构化数据 。 • 结构化数据: 指具有固定格式或有限长度 的数据,如数据库,元数据等。 • 非结构化数据: 指不定长或无固定格式的 数据,如邮件,word文档等。 • 非结构化数据又叫全文数据。
  13. 13. 索引 对非结构化数据也即对全文数据的搜索主有两种 方法: 顺序扫描法 (Serial Scanning) 适合小文件搜索和数据量不大时。 索引 从非结构化数据中提取出然后重新组织的信息 先建立索引,再对索引进行搜索的过程就叫全文 检索(Full-text Search)
  14. 14. Lucene检索过程
  15. 15. 反向索引 • 由于从字符串到文件的映射是文件到字符 串映射的反向过程,于是保存这种信息的 索引称为反向索引 • 假设我的文档集合里面有100篇文档,为了 方便表示,我们为文档编号从1到100,得 到下面的结构
  16. 16. 词典﹑倒排表 • 左边保存的是一系列字符串,称为词典 。 • 每个字符串都指向包含此字符串的文档 (Document)链表,此文档链表称为倒排 表 (Posting List)。 • 有了索引,使保存的信息和要搜索的信息一 致,可以大大加快搜索的速度。
  17. 17. • 我们要寻找既包含字符串“lucene”又包含 字符串“solr”的文档,我们只需要以下几 步: • 1. 取出包含字符串“lucene”的文档链表。 • 2. 取出包含字符串“solr”的文档链表。 • 3. 通过合并链表,找出既包含“lucene”又 包含“solr”的文件。
  18. 18. 一次索引,多次使用 • 看到这个地方,有人可能会说,全文检索的确 加快了搜索的速度,但是多了索引的过程,两 者加起来不一定比顺序扫描快多少。的确,加 上索引的过程,全文检索不一定比顺序扫描快, 尤其是在数据量小的时候更是如此。而对一个 很大量的数据创建索引也是一个很慢的过程。 • 顺序扫描是每次都要扫描,而创建索引的过程 仅仅需要一次,以后便是一劳永逸的了,每次 搜索,创建索引的过程不必经过,仅仅搜索创 建好的索引就可以了。
  19. 19. 四.Elasticsearch实战
  20. 20. 安装 • • • • • 零配置,开箱即用 没有繁琐的安装配置 各版本下载地址: 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
  21. 21. 安装中文分词插件 • https://github.com/medcl/elasticsearchanalysis-ik • 或https://github.com/awnuxkjy/es-ik • 下载后,用maven 进行编译.得到jar包放到 plugin目录下的ik目录。 • 修改config/elasticsearch.yml
  22. 22. Elasticsearch.yml
  23. 23. 确认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
  24. 24. 查看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"
  25. 25. 创建索引 • 操作流程 • 1.准备索引文档 json格式 自己拼json格式 使用第三方插件,如jdbc river 注意验证json格式有效性 • 2.提交文档到es – index – bulk • 3.返回操作结果 • 成功或者失败
  26. 26. mapping
  27. 27. Index 、Type、 Doc • Doc –索引文档,你的数据 • Index –索引库 –物理隔离 • Type –索引类型 –同类型数据
  28. 28. ES索引Java代码
  29. 29. 构造查询 • 查询流程 • 1.构造查询条件 lucene查询语法 QueryDSL查询表达式 • 2.提交给elasticsearch • 3.返回搜索结果
  30. 30. Query the document
  31. 31. lucene查询语法 • 关键字:+ - && || ! ( ) { } [ ] ^ " ~ * ? : –如果所要查询的查询词中本身包含关键字,则需 要用进行转义 • 查询词(Term) –Lucene支持两种查询词,一种是单一查询词, 如"hello",一种是词组(phrase),如"hello world"。 • 查询域(Field) –在查询语句中,可以指定从哪个域中寻找查询词, 如果不指定,则从默认域中查找。 –查询域和查询词之间用:分隔,如title:"Do it right"。
  32. 32. lucene查询语法 • 通配符查询(Wildcard) –支持两种通配符:?表示一个字符,*表示 多个字符。 –通配符可以出现在查询词的中间或者末尾, 如te?t,test*,te*t,但决不能出现在开始, 如*test,?test。性能低下! –模糊查询(Fuzzy) • 模糊查询的算法是基于Levenshtein Distance, 也即当两个词的差别小于某个比例的时候,就 算匹配,如roam~0.8,即表示差别小于0.2,相 似度大于0.8才算匹配。
  33. 33. lucene查询语法 • 临近查询(Proximity) –在词组后面跟随~10,表示词组中的多个词之间的距离 之和不超过10,则满足查询。 –所谓词之间的距离,即查询词组中词为满足和目标词 组相同的最小移动次数。 –如索引中有词组"apple boy cat"。 –如果查询词为"apple boy cat"~0,则匹配。 –如果查询词为"boy apple cat"~2,距离设为2方能匹配, 设为1则不能匹配。 –如果查询词为"cat boy apple"~4,距离设为4方能匹配。
  34. 34. 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"
  35. 35. lucene查询语法 • 布尔操作符(Boolean Operators) –布尔操作符包括连接符,如AND,OR,和修 饰符,如NOT,+,-。 –默认状态下,空格被认为是OR的关系, QueryParser.setDefaultOperator(Operator.AND) 设置为空格为AND。 – +表示一个查询语句是必须满足的 (required),NOT和-表示一个查询语句是不能满 足的(prohibited)。
  36. 36. lucene查询语法 • 灵活组合,支持级联 –可以用括号,将查询语句进行组合,从而设定优先级。 • 如(jakarta OR apache) AND website –字段组合,将多个条件组合到一个字段域下面 • 如title:(+return +"pink panther") –Lucene的查询语法是由QueryParser来进行解析,从而生成查询 对象的。 –通过编译原理我们知道,解析一个语法表达式,需要经过词法 分析和语法分析的过程,也即需要词法分析器和语法分析器。 –QueryParser是通过JavaCC来生成词法分析器和语法分析器的。
  37. 37. 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
  38. 38. Filters
  39. 39. Queries vs Filters ●full text & terms ●relevance scoring ●slower ●no caching ●terms only ●no scoring ●faster ●cacheable
  40. 40. 支持的客户端 • • • • • • • • • • • • • • • • • 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
  41. 41. JAVA-API
  42. 42. Maven repositories <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${es.version}</version> </dependency>
  43. 43. Client-类型 • Node Client –客户端节点本身也是elasticsearch节点 –也加入集群,和其它elasticsearch节点一样 –升级维护麻烦(词库,配置等等) • TransportClient –更加轻量级 –客户端socket连接到es集群 –Netty线程池
  44. 44. TransportClient

×