搜索引擎和Lucene基础(第54天)
搜索引擎组件及其组件之间的关系:
搜索引擎如何搜索图片,或者pdf文件等二进制对象?
文档是由key-value组成的,key也叫做域。
文档分析本质就是切词。
Lucene
著名的搜索引擎中关于索引链的实现方案是Lucene
Lucene可以把原始数据构建成文档,并作文档分析,创建出索引。
Lucene前端的著名实现有Elastic Search
Lucene中的文档(document)
文档是包含了一个或多个域的容器。域在Lucene中称为field(field:value就是键值对)。
在搜索的时候,其实搜索的对象是value
域:
域有很多选项,包括索引选项、存储选项、域向量使用选项;
索引选项用于通过倒排索引来控制文本是否可被搜索:索引选项可取值有:
Index:ANYLYZED:分析(切词)并单独作为索引项;
ndex.Not_ANYLYZED:不分析(不切词),把整个内容当一个索引项;
Index.ANYLYZED_NORMS:类似于Index:ANALYZED,但不存储token的Norms(加权基准)信息;
Index.Not_ANYLYZED_NORMS:类似于Index:Not_ANALYZED,但不存储值的Norms(加权基准)信息;
Index.NO: 不对此域的值进行索引;因此不能被搜索;
存储选项:是否需要存储域的真实值;
title:This is a Notebook.
store.YES:存储真实值
store.NO:不存储真实值
域向量选项用于在搜索期间该文档所有的唯一项都能完全从文档中检索时使用;
文档和域的加权操作:加权计算标准
搜索:
查询Lucene索引时,它返回的是一个有序的scoreDoc对象;查询时,Lucene会为每个文档计算出其score(评分,评分是根据加权计算来的);
Lucene 提供的API有:
IndexSearcher:搜索索引入口;
Query及其子类:
QueryParser:查询分析器
TopDocs :前几个 scoreDoc对象
ScoreDoc:
Lucene的多样化查询:
IndexSearcher类中的search方法;将输入的关键词封装成query对象,传递给search方法,具体的搜索方式有:TermQuery, TermRangeQuery,NumericRangeQuery,PrefixQuery,BooleanQuery,PhraseQuery,WildcardQuery,FuzzyQuery
TermQuery:对索引中的特定项进行搜索;Term是索引中的最小索引片段,每个Term包含了一个域名和一个文本值;
title:This is a Desk.
owner: Tom Blair
description: this is a desk, it's belong to Tom.
title: This is a table.
owner: Clinton
description: this is a desk, it's belong to Clinton.
This: (1) (2)
Desk: (1)
table: (2)
TermRangeQuery:在索引中的多个特定项中进行搜索,能搜索指定的多个域;
NumericRangeQuery:做数值范围搜索;
PrefixQuery:用于搜索以指定字符串开头的项;
BooleanQuery:用于实现组合查询;组合逻辑有: AND, OR, NOT;
PhraseQuery:
WildcardQuery:
FuzzyQuery:模糊查询;Levenshtein
ElasticSearch:
ES是一个基于Lucene实现的开源、分布式、Restful的全文本搜索引擎;此外,它还是一个分布式实时文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索;也是一个带实时分析功能的分布式搜索引擎,能够扩展至数以百计的节点实时处理PB级的数据。
基本组件:
索引(index):文档容器,换句话说,索引是具有类似属性的文档的集合。类似于表。索引名必须使用小写字母;
类型(type):类型是索引内部的逻辑分区,其意义完全取决于用户需求。一个索引内部可定义一个或多个类型。一般来说,类型就是拥有相同的域的文档的预定义。
文档(document):文档是Lucene索引和搜索的原子单位,它包含了一个或多个域。是域的容器;基于JSON格式表示。
每个域的组成部分:一个名字,一个或多个值;拥有多个值的域,通常称为多值域;
映射(mapping):原始内容存储为文档之前需要事先进行分析,例如切词、过滤掉某些词等;映射用于定义此分析机制该如何实现;除此之外,ES还为映射提供了诸如将域中的内容排序等功能。
ES的集群组件:
Cluster:ES的集群标识为集群名称;默认为"elasticsearch"。节点就是靠此名字来决定加入到哪个集群中。一个节点只能属性于一个集群。
Node:运行了单个ES实例的主机即为节点。用于存储数据、参与集群索引及搜索操作。节点的标识靠节点名。
Shard:将索引切割成为的物理存储组件;但每一个shard都是一个独立且完整的索引;创建索引时,ES默认将其分割为5个shard,用户也可以按需自定义,创建完成之后不可修改。
shard有两种类型:primary shard和replica。Replica用于数据冗余及查询时的负载均衡。每个主shard的副本数量可自定义,且可动态修改。
评论
发表评论