lucene原理及java实现_Lucene 源码系列——查询原理(上)

第一小节 Lucene 常见查询的使用

从本篇文章开始介绍 Lucene 查询阶段的内容,由于 Lucene 提供了几十种不同方式的查询,但其核心的查询逻辑是一致的,该系列的文章通过 Query 的其中的一个子类 BooleanQuery,同时也是作者在实际业务中最常使用的,来介绍 Lucene 的查询原理。

查询方式

下文中先介绍几种常用的查询方式的简单应用:

TermQuery

BooleanQuery

WildcardQuery

PrefixQuery

FuzzyQuery

RegexpQuery

PhraseQuery

TermRangeQuery

PointRangeQuery

TermQuery

图 1:

ada56e4948db46786dcac0ebfcd6c625.png

图 1 中的 TermQuery 描述的是,我们想要找出包含**域名(FieldName)为“content”,域值(FieldValue)中包含“a”的域(Field)**的文档。

BooleanQuery

图 2:

7fa3f01d379a4fda4968f531c2de3987.png

BooleanQuery 为组合查询,图 2 中给出了最简单的多个 TermQuery 的组合(允许其他查询方式的组合),上图中描述的是,我们期望的文档必须至少(根据 BooleanClause.Occur.SHOULD)满足两个 TermQuery 中的一个,如果都满足,那么打分更高。

WildcardQuery

该查询方式为通配符查询,支持两种通配符:

// 星号通配符 * public static final char WILDCARD_STRING = '*';

// 问号通配符 ? public static final char WILDCARD_CHAR = '?';

// 转义符号(escape character) public static final char WILDCARD_ESCAPE = '\\';

星号通配符描述的是匹配零个或多个字符,问号通配符描述的是匹配一个字符,转义符号用来对星号跟问号进行转移,表示这两个作为字符使用,而不是通配符。

图 3:

73cbc605aa83036029e450de0536a45b.png

问号通配符的查询:

图 4:

e180a96da1602e90030ed0285ddcce99.png

图 4 中的查询会匹配文档 3,文档 1。

星号通配符的查询:

图 5:

19d758d748955637f06b0f8d7abf267c.png

图 4 中的查询会匹配文档 0、文档 1、文档 2、文档 3。

转义符号的使用:

图 6:

4f07c6cb4d29d25487490846217fab8f.png

图 4 中的查询会匹配文档 3。

PrefixQuery

该查询方式为前缀查询:

图 7:

3049706d3926f2b3ecbeb92ccdc0de11.png

图 7 中的 PrefixQuery 描述的是,我们想要找出包含域名为“content”,域值的前缀值为"go"的域的文档。

以图 3 为例子,图 7 的查询会匹配文档 0、文档 1。

FuzzyQuery

该查询方式为模糊查询,使用编辑距离来实现模糊匹配,下面的查询都是以图 3 作为例子:

图 8:

bd5c37a8fc1ccc2c8179d2422bff71ed.png

图 8 中的各个参数介绍如下:

maxEdits:编辑距离的最大编辑值

prefixLength:模糊匹配到的 term 的至少跟图 8 中的域值"god"有两个相同的前缀值,即 term 的前缀要以"go"开头

maxExpansions:在 maxEidts 跟 prefixLength 条件下,可能匹配到很多个 term,但是只允许处理最多 20 个 term

transpositions:该值在本篇文档中不做介绍,需要了解确定型有穷自动机的知识

图 8 中的查询会匹配文档 0、文档 1。

图 9:

70dba1ff5e376fb77cfef5b8cce5359c.png

图 9 中的方法最终会调用图 8 的构造方法,即 maxExpansions 跟 transpositions 的值会使用默认值:

maxExpansions:默认值为 50

transpositions:默认值为 true

图 9 中的查询会匹配文档 0、文档 1。

图 10:

a6cb9b39b8dc5500faf5675f9e6d9f44.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值