Lucene基础

242 阅读3分钟

相关概念

  • 文档:索引和搜索的主要数据载体,它包含多个或一个字段,存放将要写入索引或将从索引搜索出来的数据。
  • 字段:文档的一个字段,它包括两个部分,字段的名称和内容。
  • 词项:搜索时的一个单位,代表文本中的某个词。(关键字)
  • 词条:词项在字段中的一次出现,包括词项的文本,开始和结束的位移以及类型

Lucene是将写入索引的所有信息组织成一种倒排索引的结构。该结构是一种将词项映射到文档的一种数据结构,也就是常见意义上的关键字定位文档,其工作方式与传统的关系数据库不同。

举个例子: 我们有三个文档,建立索引后的索引项如下

词项计数文档
41<3>
Apache1<3>
Cookbook1<3>
ElasticSearch2<1><2>
Mastering1<1><1>
Server1<1>
Solr1<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中计算的分数值越大,意味着文档越相关。