搜索引擎与Lucene基础

简单常识:
1千万条日志记录存储大小为2G
1亿条日志记录 5G
8亿条日志记录 40G

程序: 算法+数据结构
存储+前端访问接口

开发全文搜索程序: 算法+支持这种场景的特定存储结构
海量日志分析: 搜索引擎
搜索引擎: 存储时需要有索引链–> 搜索组件(有请求接口有请求返回或展示UI)

收集日志 –> 对收集过来日志检索原始内容–> 构建文档 –>文档分析或切词 –> 建立索引链(创建倒排索引)
而SQL的索引: 正排索引

文档数据库: Mongodb、elasticsearch(每一行中每字段文档数据格式各不一样)

著名开源搜索开发库或底层搜索引擎: Lucene
添加收集文档,搜索引擎,提供上层搜索接口: Elasticsearch

包含一个或多个域的容器,文档就是由Field、Value组成
Lucene没有全局模式:no schema,没有预先定义字段及类型
域有很多选项: 索引选项、存储选项、每个域向量使用选项
索引选项用于通过倒排索来控制文本是否可被搜索,成为索引中的项才能被搜索:
index: ANALYZIED 需要分析或分词并单独构建索引项
index: not_ANALYZIED 不分析或不分词,把整个内容当一个索引项
index: analyzied norms 类似index: ANALYZIED,不会在存储中存储加权信息(Norms:加权基准)
index.Not_analyzied_norms 类似not_ANALYZIED,不会在存储中存储加权信息(Norms:加权基准)
index.NO : 不对此域的值进行索引,因此不能被搜索
存储选项: 是否需要存储域的真实值
title: This is a Notebook. –> this notebook 有效信息即可
store.YES: 存储真实值
store.NO: 不存储真实值

(每个项或每个域)向量选项用于在搜索期间控制该文档所有的唯一项都能完全从文档域中检索时使用

文档和域的加权操作: 通过改变某一个文档相对于某一个词的加权因子,对值改大改小可以决定它对用户的重要程序,如竟价排名
加权计算标准:方案很多

搜索:查询Lucene索引时,返回一个有序的scoreDoc对象:
查询时Lucene会为每个文档计算出score,
API: IndexSearcher: 搜索索引入口
Query及其子类:构建搜索查询语句
QueryParser: 搜索分析后返回结果
TopDocs 某查询分值top10

Lucene的多样化查询:
IndexSearcher中的search方法,完成搜索时传入Query实例参数进行,就是告之到底要搜索什么,你键入的搜索关键词分析以后作为Query对象,传递给IndexSearch方法

常用几种查询方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TermQuery: 对索引中特定项进行搜索,Term是索引中的最小索引片段,每个Term包含一个域名和文本值

title: This is a Desk
title: Tis is a table
索引构建方式: This: (1) (2)
Desk: (1)
table: (2)

TermRangeQuery:索引中每个Term对象上的值都会按照字典编排顺序进行排序,并允许在Lucene TermRangeQuery 提供的范围内进行搜索
大白话就是TermQuery指定一个域中搜索,TermRangeQuery可以指定多个域内搜索

NumericRangeQuery: 只是数值范围内搜索
PrefixQuery: 用于搜索以指定字符串开头的域
BooleanQuery:用于实现组合查询,与或非 and 、or、 not
PhraseQuery: 能够跟据位置信息定义文档
WildcardQuery:通配符
FuzzyQuery: 模糊查询
levenshtein处理

总结

  • Lucene是底层搜索引擎或搜索开发库,基于Lucene库开发有了Elasticsearch存储、搜索引擎系统