相关概念
- 文档:索引和搜索的主要数据载体,它包含多个或一个字段,存放将要写入索引或将从索引搜索出来的数据。
- 字段:文档的一个字段,它包括两个部分,字段的名称和内容。
- 词项:搜索时的一个单位,代表文本中的某个词。(关键字)
- 词条:词项在字段中的一次出现,包括词项的文本,开始和结束的位移以及类型
Lucene是将写入索引的所有信息组织成一种倒排索引的结构。该结构是一种将词项映射到文档的一种数据结构,也就是常见意义上的关键字定位文档,其工作方式与传统的关系数据库不同。
举个例子: 我们有三个文档,建立索引后的索引项如下
| 词项 | 计数 | 文档 | |
|---|---|---|---|
| 4 | 1 | <3> | |
| Apache | 1 | <3> | |
| Cookbook | 1 | <3> | |
| ElasticSearch | 2 | <1><2> | |
| Mastering | 1 | <1> | <1> |
| Server | 1 | <1> | |
| Solr | 1 | <3> |
每个词项指向该词项的出现过的文档。这种方式支持快速有效的搜索操作,例如基于词项的查询。每个词项维持一个计数,用来统计每个词项在多少个文档中出现过。
段
每个索引由多个段组成,每个段只会被创建一次但会被查询多次。索引期间,段经创建就不会被修改,且当文档被删除后,删除信息另外保存,段本身并没有被修改。
多个段会在一个叫段合并的阶段被合并在一起,要么强制执行,要么由Lucene的内在机制决定在某个时刻执行,合并后段的数量变少,但是变大。段合并非常耗IO,尽量避免强制段合并。
分析器
数据如何转换为倒排索引?查询串如何转换为可用于搜索的词项?这个过程叫分析,是由分析器完成,分析器由三部分组成:
- 分词器:将文本切割成词条,其中携带着各种额外信息的词项,这些信息包括:词项在原始文本中的位置,词项的长度。输出为词条流。
- 过滤器:过滤器数量可选,可为0,1或多个,对词条流中的词条进行过滤。Lucene有很多现成的过滤器。
- 小写过滤器:所有词条转换为小写
- ASCII: 移除词条中所有非ASCII字符
- 字符映射器:可以用来调用分词器之前的文本预处理操作,如HTML文本的去标签处理。
Lucene查询语言
一个查询通常被分为词项与操作符。Lucene中的词项可以是单个词,也可以是一个短语。如果设置了查询分析过程,那么预先选择的分析器将会对查询中的所有词项进行处理。
- AND:它的含义是,同时存在才返回,比如说apache AND lucene这样的查询,只有同时包含两个词项的文档才会被返回。
- OR
- NOT:lucene NOT eleasticsearch这样的查询,只有包含lunce并不包含eleasticsearch才返回文档。
- +: 必须出现
- -: 不能出现
- 不写默认是OR
在字段中查询
文档是由字段组成,所有数据都存在字段中,字段是有名字的,如果我们需要在某个字段中查询,可以用字段名称进行查询后面接上查询从句,如,想在title字段中查询包含词项elasticsearch的文档,执行的查询串是 title:elasticsearch
词项修饰符
Lucene允许用户使用修饰符。
- 通配符:?和 *,前者匹配任意一个字符,后者匹配多个字符
- 模糊查询:通过使用'~'字符后接整数值
- 字符转义
评分
什么是文档的得分?
得分是文档和查询的匹配度用计分公式计算的结果。默认算法是(词频/逆向文档频率)。ES中计算的分数值越大,意味着文档越相关。