函数指针是指向函数的指针变量,它可以像一般函数一样,用于调用函数、传递参数。
Elasticsearch之Search
一、概念
Elasticsearch主要有两种查询方式,URISearch和Request Body Search。
URISearch
Request Body Search
二、实战
三、参考
Elasticsearch之命令行操作
一、基础
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的,这三个产品被设计成一个集成解决方案,称为
Elastic Stack
(旧称ELK stack
)。它是一种能够从任意数据源抽取数据,并实时对数据进行搜索、分析和可视化展现的数据分析框架。
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行,它支持文件上传和下载,所以是综合传输工具,但按传统习惯称cURL为下载工具。通过制定不同的参数可实现不同的功能,常见如下:
-X command
:指定HTTP请求方法,command常见如:GET
、PUT
、POST
、DELETE
等,默认GET。-H name:value
:指定HTTP请求header,常见如Cache-Control:no-cache
、Content-Type: application/json
-d command
:指定HTTP请求POST方式请求数据,如-d 'login=emma&password=123'-X POST
或-d 'login=emma' -d 'password=123' -X POST
Elasticsearch常用命令,参考
_cat
命令用户查看系统相关信息,可指定不同的子命令实现不同查询,常见如下:nodes
子命令用于列出实例有几个节点indices
子命用于令列出实例的索引
_update
命令用于更新文档,需要配合doc
属性一起使用_search
命令用于查询文档,可指定查询条件_all
命令用于查询文档所有的索引
url后添加
?v
参数可查看具体信息
二、实战
- API:
curl -XGET "localhost:9200/_cat"
1 | =^.^= |
索引相关
- 创建索引
curl -XPUT "localhost:9200/liusir"
-XPOST
会报错{"error":"Incorrect HTTP method for uri [/liusir] and method [POST], allowed: [PUT, DELETE, HEAD, GET]","status":405}
- 查看索引
curl -XGET "localhost:9200/_cat/indices?v"
- 删除索引信息
curl -XDELETE "localhost:9200/example1?pretty"
- 查询索引
curl -XGET "localhost:9200/liusir?pretty"
- 创建索引
文档相关
- 插入文档
curl -XPOST -H "Content-Type: application/json" -d '{"addr":"beijing"}' "localhost:9200/liusir/1"
-XPUT
则必须多级,如curl -XPUT -H "Content-Type: application/json" -d '{"name":"liusir"}' "localhost:9200/liuyulong/user/1"
- 查看文档,语法
GET index(索引名称)/type(type名称)/id(id的值)
- 查看文档不指定索引
curl -XGET "localhost:9200/_search?pretty"
- 查看文档指定索引
curl -XGET "localhost:9200/liusir/_search?pretty"
- 根据主键查询文档
curl -XGET "localhost:9200/liuyulong/user/1?pretty"
- 查看文档不指定索引
- 更新文档
- 方式一:
curl -XPOST -H "content-type:application/json" "localhost:9200/liuyulong/user/1?pretty" -d '{"name":"haha"}'
- 重新查看
curl -XGET "localhost:9200/liuyulong/user/1?pretty"
- 重新查看
- 方式二:
curl -XPOST -H "content-type:application/json" "localhost:9200/liuyulong/user/1/_update?pretty" -d '{"doc":{"name":"heihei"}}'
- 重新查看
curl -XGET "localhost:9200/liuyulong/user/1?pretty"
- 重新查看
- 方式一:
- 删除文档
curl -XDELETE "localhost:9200/liuyulong/user/1?pretty"
- 重新查看
curl -XGET "localhost:9200/liuyulong/user/1?pretty"
- 重新查看
- 插入文档
指定查询条件
_search
初始化数据
curl -XPUT -H "Content-Type: application/json" -d '{"name":"liusir","age":10}' "localhost:9200/liuyulong/user/1"
curl -XPUT -H "Content-Type: application/json" -d '{"name":"liuliu", "age":10}' "localhost:9200/liuyulong/user/2"
curl -XPUT -H "Content-Type: application/json" -d '{"name":"liu"}' "localhost:9200/liuyulong/user/3"
查询所有
curl -XGET "localhost:9200/liuyulong/user/_search?pretty"
查询指定字符串
curl -XGET "localhost:9200/liuyulong/user/_search?pretty" -d '{"query":{"match":{"name":"liusir"}}}' -H "content-type:application/json"
不返回文档内容
curl -XGET "localhost:9200/liuyulong/user/_search?pretty" -d '{"_source":"false","query":{"match":{"name":"liusir"}}}' -H "content-type:application/json"
返回指定字段
curl -XGET "localhost:9200/liuyulong/user/_search?pretty" -d '{"_source":["name"],"query":{"match":{"name":"liusir"}}}' -H "content-type:application/json"
AND条件
curl -XPUT -H "Content-Type: application/json" -d '{"name":"liusir","age":10}' "localhost:9200/liuyulong/user/4"
curl -XPUT -H "Content-Type: application/json" -d '{"name":"liuliu", "age":10}' "localhost:9200/liuyulong/user/5"
curl -XGET "localhost:9200/liuyulong/user/_search?pretty" -d '{"query":{"bool":{"must":[{"match":{"name":"liusir"}},{"match":{"age":10}}]}}}' -H "content-type:application/json"
OR条件
curl -XGET "localhost:9200/liuyulong/user/_search?pretty" -d '{"query":{"bool":{"should":[{"match":{"name":"liusir"}},{"match":{"age":10}}]}}}' -H "content-type:application/json"
排序,好麻烦
聚合插叙
- 平均值
- 最大值/最小值
多级索引
三、参考
Elasticsearch之搜索原理
一、概念
ES搜索为什么这么快:简单来说就是使用了使用了lucene的倒排索引技术。
- 倒排索引源于实际应用中需要根据属性的值来查找记录,这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址
- 由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)
- 带有倒排索引的文件称为倒排索引文件,简称倒排文件(inverted file)
- 搜索引擎的关键步骤就是建立倒排索引,倒排索引一般由
关键词 + 关键词频度(出现的次数) + 关键词位置(出现在哪一篇文章或网页中,有关的日期,作者等信息)
组成,它相当于为互联网上几千亿页网页做了一个索引,好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面,不必再从书的第一页到最后一页,一页一页的查找
lucene:是一个开放源代码的高性能的java全文检索引擎工具包,不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。其目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者以此为基础建立起完整的全文检索引擎。
二、倒排索引原理
设有两篇文章1和2:
文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
文章2的内容为:He once lived in Shanghai.
- 取得关键词:由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施:
- 分词:英文单词用空格分隔,比较好处理,中文单词间是连在一起的需要特殊的分词处理。
- 过滤:文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词以及标点符号可以过滤掉。
- 关键词转换大小写:用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
- 关键词还原原时态:用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
在lucene中以上措施由Analyzer类完成,经过上面处理后:
文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
文章2的所有关键词为:[he] [live] [shanghai]
建立倒排索引:经过步骤1取到关键词后就可以建立倒排索引了,上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来变成: “关键词”对“拥有该关键词的所有文章号”。
- 所以文章1和2倒排后如下:
1 | 关键词 文章号 |
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:
字符位置,即记录该词是文章中第几个字符,优点是关键词亮显时定位快
关键词位置,即记录该词是文章中第几个关键词,优点是节约索引空间、词组(phase)查询快,lucene中记录的就是这种位置。
- 加上“出现频率”和“出现位置”信息后,倒排索引结构变为
1 | 关键词 文章号[出现频率] 出现位置 |
以live关键词为例说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第 2个关键字。
关键字是按字符顺序排列的,因此lucene可以用二分搜索算法快速定位关键词。
实现:lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)和位置文件(positions)保存。
- 词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
- lucene中使用了field的概念,用于表达信息所在位置(如标题,文章,url)。建倒排索引时该field信息也记录在词典文件中,每个关键词都有一个field信息,因为每个关键字一定属于一个或多个field。
压缩算法:为了减小索引文件的大小,lucene对索引还使用了压缩技术。
- 首先对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。
- 其次大量用到的是对数字的压缩,数字只保存与上一个值的差值,这样可以减小数字的长度,进而减少保存该数字需要的字节数。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)。
查询:假设要查询单词 “live”,lucene先对词典进行二分查找找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。
- 词典通常非常小,因而,整个过程的时间是毫秒级的。
- 如果用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。
三、参考
Elasticsearch之分析器
一、概念
Elasticsearch使用一种称为倒排索引的结构,它适用于快速的全文搜索,一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。对文档最全文索引,要依次经过字符过滤器、分词器、Token过滤器,这整个过程就称为分析器,经过分析器后最终形成文档的索引结构。
- 字符过滤器:字符串按顺序通过每个字符过滤器,它的作用是在分词前整理字符串,如一个字符过滤器可以用来去掉
HTML
,或者将&
转化成and
。 - 分词器:经过字符过滤器的字符串会被
分词器
分为单个的词条,如一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。 - Token过滤器:被分隔后的词条按顺序通过每个
token
过滤器,这个过程可能会改变词条(大小写转换)、删除词条(如英文中的a、and、the等词)、增加词条(如jump和leap这种同义词)。
Elasticsearch内置分析器
- 标准分析器:standard,默认,它根据Unicode联盟定义的单词边界划分文本,删除绝大部分标点,最后将词条小写。
- 简单分析器:simple,在任何不是字母的地方分隔文本,将词条小写。
- 空格分析器:whitespace,在空格的地方划分文本。
- 语言分析器:language,根据指定语言的特点,会删除无用词条。
- language语言支持列表,传送门
二、实战
- 官方demo:
curl -X GET "localhost:9200/_analyze?pretty" -H 'Content-Type:application/json' -d '{"analyzer": "standard","text": "Text to analyze"}'
1 | { |
- 语言分析器english:
curl -X GET 'localhost:9200/_analyze?pretty' -H 'Content-Type:application/json' -d '{"analyzer": "english","text": "This is a test text,however, i do not know what to write!"}'
1 | { |
中文分析器(安装完后要重启实例)
-
- 安装:
./bin/elasticsearch-plugin install analysis-icu
- 使用:
curl -X GET 'localhost:9200/_analyze?pretty' -H 'Content-Type:application/json' -d '{"analyzer": "icu_analyzer","text": "自由、平等、公正、法治体现了社会主义核心价值观在价值导向上的规定,是立足社会层面提出的要求,反映了社会主义社会的基本属性,始终是党和国家奉行的核心价值理念。"}'
- 安装:
-
安装:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
- 报错,版本问题
1
2
3
4
5
6
7-> Installing https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0.zip
-> Downloading https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0. zip
[=================================================] 100%
-> Failed installing https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/ elasticsearch-analysis-ik-6.3.0.zip
-> Rolling back https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3. 0.zip
-> Rolled back https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.3.0/elasticsearch-analysis-ik-6.3.0. zip
Exception in thread "main" java.lang.IllegalArgumentException: Plugin [analysis-ik] was built for Elasticsearch version 6. 3.0 but version 7.6.0 is running重新安装:
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
- 报错,权限问题
1
2
3
4-> Failed installing https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12.0.zip
-> Rolling back https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7. 12.0.zip
-> Rolled back https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.0/elasticsearch-analysis-ik-7.12. 0.zip
Exception in thread "main" java.nio.file.FileSystemException: /usr/local/elk-elasticsearch-7.12.0/config/analysis-ik: Operation not permitted重启报错,权限问题,
chmod -R 777 plugins/analysis-ik/
和sudo chmod -R 777 config/analysis-ik
1
2Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /usr/local/elk-elasticsearch-7.12.0/config/analysis-ik
Likely root cause: java.nio.file.AccessDeniedException: /usr/local/elk-elasticsearch-7.12.0/config/analysis-ik重启实例
使用:
curl -X GET 'localhost:9200/_analyze?pretty' -H 'Content-Type:application/json' -d '{"analyzer": "ik_max_word","text": "富强、民主、文明、和谐是我国在社会主义初级阶段的奋斗目标,体现了社会主义核心价值观在发展目标上的规定,是立足国家层面提出的要求。"}'
使用:
curl -X GET 'localhost:9200/_analyze?pretty' -H 'Content-Type:application/json' -d '{"analyzer": "ik_smart","text": "中国共产党是马克思主义政党,马克思主义追求的终极目标是人的自由和全面的发展,党从成立之初就将其写在自己的旗帜上,并为之做出不懈奋斗,在实践上极大发展了人民的自由和平等,极大发展了社会的公正和法治。"}'
-
三、参考
Elasticsearch之索引模板
一、基础
索引模板是预先定义好的在创建新索引时自动应用的模板,主要包括索引设置、映射和模板优先级等配置。通俗地说,索引模板就是把已经创建好的某个索引的参数设置(settings)和索引映射(mapping)保存下来作为模板,在创建新索引时指定要使用的模板名就可以直接重用已经定义好的模板中的设置和映射。
- settings:指定index的配置信息,比如分片数、副本数、tranlog同步条件、refresh策略等信息;
- mappings:指定index的内部构建信息,主要有:
- _all:All Field字段,如果开启,_all字段就会把所有字段的内容都包含进来,检索的时候可以不用指定字段查询,设置方式:
"_all": {"enabled": true};
。 - _source:Source Field字段,ES为每个文档都保存一份源数据,如果不开启(
"_source": {"enabled": false}
),查询的时候就只会返回文档的ID,文档其他内容需要通过Fields字段到索引中再次获取,效率很低。但若开启索引的体积会更大,此时就可以通过Compress进行压缩,并通过inclueds、excludes等方式在field上进行限制。 - properties:最重要的配置,是对索引结构和文档字段的设置。
- _all:All Field字段,如果开启,_all字段就会把所有字段的内容都包含进来,检索的时候可以不用指定字段查询,设置方式:
二、使用(7.4.0)
- 创建索引模板
1 | curl -X PUT "localhost:9200/_template/template_1" -H "content-type:application/json" -d'{ |
查看索引模板
curl -XGET "localhost:9200/_cat/templates?v"
curl -XGET "localhost:9200/_cat/templates/template_1?v"
curl -XGET "localhost:9200/_cat/templates/temp*?v"
curl -XGET "localhost:9200/_template/temp*?pretty"
curl -XGET "localhost:9200/_template?pretty"
删除索引模板
curl -XDELETE "localhost:9200/_template/template_1""
模板是否存在
curl --head http://localhost:9200/_template/template_1
三、参考
Elasticsearch之配置
一、内容
在Elasticsearch安装目录下的conf文件夹中包含了一个重要的配置文件:elasticsearch.yml。Elasticsearch的配置信息有很多种,大部分配置都可以通过elasticsearch.yaml和接口的方式进行。
1 | # ======================== Elasticsearch Configuration ========================= |
二、参考
Elasticsearch之插件
一、概念
Elasticsearch插件是一种增强Elasticsearch核心功能的途径,它们可以为es添加自定义映射类型、自定义分词器、原生脚本、自伸缩等等扩展功能。它包含核心插件和第三方插件两种,安装之后需要重启集群中的每个节点才能使插件生效。
二、安装使用
安装方式
- 命令行安装(只支持核心插件)
./elasticsearch-plugin install package_name
,官方核心库
- URL安装
- 本地安装
- 命令行安装(只支持核心插件)
卸载方式
- 命令行卸载
- delete插件目录
三、参考
elasticsearch-head插件
一、概念
elasticsearch-head就是一款能连接ElasticSearch搜索引擎,并提供可视化的操作页面对ElasticSearch搜索引擎进行各种设置和数据检索功能的管理插件,如在head插件页面编写RESTful接口风格的请求,就可以对ElasticSearch中的数据进行增删改查、创建或者删除索引等操作。它类似于使用navicat工具连接MySQL这种关系型数据库,对数据库做操作。
二、安装使用
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
http://localhost:9100/
- 修改Elasticsearch配置文件
1 | http.cors.enabled: true |
三、参考
Filebeat-Logstash-Elasticsearch解析nginx日志
一、概念
倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index
),也称反向索引(与之对应的是正向索引(forward index
))。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file
)。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
通俗地说,正向索引是通过
key
找value
,反向索引则是通过value
找key
。
二、分析
在搜索引擎中,每个文件都对应一个文件ID,文件内容则是由一系列关键词的集合所组成(实际上在搜索引擎索引库中关键词也已经转换为关键词ID)。例如某个文档,经过分词提取了20个关键词,然后组成类似文档ID:关键词(出现次数、位置等)这种结构,就是我们平时所说的正向索引。正常情况下,当我们在搜索引擎中搜索某个关键字时,需要依次扫描所有的文档,找出所有包含此关键字的文档。随着文档数量的增加,这个扫描时间也会增长,无法满足实时返回查询结果的要求。
1 | docId1:关键词1,关键词2,... |
以上只是最基本的正向索引结构
为了便于快速检索关键词,我们构建一个类似关键词:文档ID(出现次数、位置等)这样的机构,即关键词到文档ID的映射,每个关键词都对应着一系列的文件,表示这些文件中都出现了这个关键词。
1 | 关键词1:docId1,docId2,... |
以上只是最基本的反向索引结构
三、组成
- 关键词——文档矩阵,也称
单词——文档矩阵
文档1 | 文档2 | 文档3 | 文档4 | |
---|---|---|---|---|
关键词1 | ✔️ | ✔️ | ||
关键词2 | ✔️ | ✔️ | ||
关键词3 | ✔️ | ✔️ | ||
关键词4 | ✔️ | ✔️ |
从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了关键字1和关键字4。从横向即关键词这个维度来看,每行代表了哪些文档包含了某个关键词。如对于关键词1来说,文档1和文档2中包含此关键词1。
搜索引擎的索引其实就是实现“关键词-文档矩阵”的具体数据结构,可以有不同的方式来实现上述概念模型,如倒排索引、签名文件、后缀树等方式。但是各项实验数据表明,倒排索引是实现单词到文档映射关系的最佳实现方式。
一些概念
- 文档(
Document
):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说涵盖更多种形式。比如word
,pdf
,html
,xml
等不同格式的文件都可以称之为文档,再比如一封邮件、一条短信、一条微博也可以称之为文档。 - 文档集合(
Document Collection
):由若干文档构成的集合称之为文档集合,如海量的互联网网页或者说大量的电子邮件。 - 文档编号(
Document ID
):在搜索引擎内部会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为文档编号,简称DocID。 - 单词编号(
Word ID
):与文档编号类似,搜索引擎内部以唯一的编号来表示某个单词。 - 倒排索引(
Inverted Index
):倒排索引是实现单词-文档矩阵的一种具体存储形式,通过倒排索引可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:单词词典和倒排文件。- 单词词典(
Lexicon
):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向倒排列表的指针。- 倒排列表:它记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项。根据倒排列表即可获知哪些文档包含某个单词等信息。
- 倒排文件(
Inverted File
):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。
- 单词词典(
- 文档(
简单实例
文档标号 | 文档内容 |
---|---|
1 | 谷歌地图之父跳槽Facebook |
2 | 谷歌地图之父加盟Facebook |
3 | 谷歌地图创始人拉斯离开谷歌加盟Facebook |
4 | 谷歌地图之父跳槽Facebook与Wave项目取消有关 |
5 | 谷歌地图之父拉斯加盟社交网站Facebook |
中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,以及该单词在文档中出现的频率及位置,就构成了基本的倒排索引结构。
单词ID | 单词 | 倒排列表(DocID;TF;<Pos ,Pos ,…>) |
---|---|---|
1 | 谷歌 | (1;1;<1>),(2;1;<1>),(3;2;<1,6>),(4;1;<1>),(5;1;<1>) |
2 | 地图 | (1;1;<2>),(2;1;<2>),(3;1;<2>),(4;1;<2>),(5;1;<2>) |
3 | 之父 | (1;1;<3>),(2;1;<3>),(4;1;<3>),(5;1;<3>) |
4 | 跳槽 | (1;1;<4>),(4;1;<4>) |
5 | (1;1;<5>),(2;1;<5>),(3;1;<8>),(4;1;<5>),(5;1;<8>) | |
6 | 加盟 | (2;1;<4>),(3;1;<7>),(5;1;<5>) |
7 | 创始人 | (3;1;<3>) |
8 | 拉斯 | (3;1;<4>),(5;1;<4>) |
9 | 离开 | (3;1;<5>) |
10 | 与 | (4;1;<6>) |
11 | Wave | (4;1;<7>) |
12 | 项目 | (4;1;<8>) |
13 | 取消 | (4;1;<9>) |
14 | 有关 | (4;1;<10>) |
15 | 社交 | (5;1;<6>) |
16 | 网站 | (5;1;<7>) |
- 单词词典
单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在搜索时,根据用户的查询单词去单词词典里查询,就能够获得相应的倒排列表,并以此作为后续排序的基础。高效且常用的实现单词词典的数据结构主要有哈希加链表和树形词典结构。
四、参考
全文搜索引擎
一、常见全文搜索引擎
搜索引擎大致分为四种:全文搜索引擎、元搜索引擎、垂直搜索引擎和目录搜索引擎,它们各有特点并适用于不同的搜索环境。
ElasticSearch:ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
- ElasticSearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
- ElasticSearch 完全支持 Apache Lucene 的接近实时的搜索。
- 处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
- ElasticSearch 采用 Gateway 的概念,使得完备份更加简单。
- 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
Solr:Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。
- Solr建立索引时候会产生io阻塞,查询性能较差, 搜索效率下降,实时搜索效率不高,es实时搜索效率高
- 随着数据量的增加,Solr的搜索效率会变得更低,而ElasticSearch却没有明显的变化
- Solr利用Zookeeper进行分布式管理,而ElasticSearch自身带有分布式协调管理功能。
- Solr支持更多格式的数据,比如JSON、XML、CSV,而ElasticSearch仅支持json文件格式。
- Solr官方提供的功能更多,而ElasticSearch本身更注重于核心功能,高级功能多有第三方插件提供
- Solr在传统的搜索应用中表现好于ElasticSearch,但在处理实时搜索应用时效率明显低于ElasticSearch。
- Solr是传统搜索应用的有力解决方案,但ElasticSearch更适用于新兴的实时搜索应用。
Sphinx:Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如Java,PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。
Xapian:Xapian是一个用C++编写的全文检索程序,他的作用类似于Java的lucene。尽管在Java世界lucene已经是标准的全文检索程序,在C/C++世界中虽然有lucene的一个版本clucene,但是在业界却是一个饱受争议的使用(毕竟是通过修改Java的代码改编而来的),但Xapian则是原生支持C/C++的,并且他能够支持php、python等语言的动态绑定。Xapian的api和检索原理和lucene在很多方面都很相似,但是也有一些地方存在不同,具体请看Xapian自己的文档Xapian除了提供原生的C++编程接口之外,还提供了Perl,PHP,Python和Ruby编程接口和相应的类库,所以你可以直接从自己喜欢的脚本编程语言当中使用Xapian进行全文检索了。