Solr怎么建立索引和查询
Solr有非常多的功能,但是所有搜索引擎都没法脱离索引和查询,Solr全文检索也是类似的原理,它可以归结为两个过程: 1.索引创建(Indexing) 2. 搜索索引(Search)。因此下面将会对这两个部分展开讲解。
Solr建立索引的过程
前面文章提到过,Solr/Lucene采用的是一种反向索引,所谓反向索引:就是从关键字到文档的映射过程,保存这种映射这种信息的索引称为反向索引。
左边保存的是字符串序列
右边是字符串的文档(Document)编号链表,称为倒排表(Posting List)
索引创建
假设有如下两个原始文档:
文档一:
Students should be allowed to go out with their friends, but not allowed to drink
beer.
文档二:
My friend Jerry went to school to see his students but found them drunk which is not allowed.
创建过程大概分为如下步骤:
- 1.把原始文档交给分词组件(Tokenizer)
分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token)
a.将文档分成一个一个单独的单词
b.去除标点符号
c.去除停词(stop word)
所谓停词(Stop word)就是一种语言中没有具体含义,因而大多数情况不会作为搜索的关键词,这样一来创建索引时能减少索引的大小。经过分词(Tokenizer)后得到的结果称为词汇单元(Token)。
上例子中,便得到以下词汇单元(Token):“Students”,“allowed”,“go”,“their”,“friends”,“allowed”…….等等
- 2.词汇单元(Token)传给语言处理组件(Linguistic Processor)
语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些语言相关的处理。对于英语,语言处理组件(Linguistic Processor)一般做以下几点:
a.变为小写(Lowercase)。
b.将单词缩减为词根形式,如”cars”到”car”等。
c.将单词转变为词根形式,如”drove”到”drive”等。
d.语言处理组件(linguistic processor)处理得到的结果称为词(Term)
例子中经过语言处理后得到的词(Term)如下: “student”,“allow”,“go”,“their”,“friend”,“allow”,……等等
- 3.得到的词(Term)传递给索引组件(Indexer)
a.利用得到的词(Term)创建一个字典
b.对字典按字母顺序排序:Term Document ID
c.合并相同的词(Term)成为文档倒排(Posting List)链表
至此索引创建完成,搜索”drive”
时,”driving”,”drove”,”driven”
也能够被搜到。因为在索引中,”driving”,”drove”,”driven”
都会经过语言处理而变成”drive”
,在搜索时,如果您输入”driving”
,输入的查询语句同样经过分词组件和语言处理组件处理的步骤,变为查询”drive”
,从而可以搜索到想要的文档。
Solr搜索的工作流程
用户输入查询字符串,根据用户的请求类型qt(查询为/select)选择请求处理器RequestHandler,根据用户输入的参数defType来选择一个查询解析器解析用户的查询串(默认使用RequestHander中配置的默认查询解析器),查询解析器解析完以后根据用户输入的参数qf指定的字段进行搜索(默认是所有索引字段),查询到结果以后做一些特殊的处理(fq,sort,start,rows,wt)以后使用响应处理器ResponseWriter返回给用户。
Solr的查询
Solr的查询,首先会对查询条件进行词法分析、语法分析、语言处理,然后通过分析后的词到索引中查询,然后得到存在指定词的文档集合,然后再进行对结果的一些处理,例如排序或者查找指定的条目数的文档等。主要步骤:
第一步.对查询内容进行词法分析、语法分析、语言处理,最主要的处理
第二步.搜索索引,得到符合语法树的文档集合
第三步.根据查询语句与文档的相关性,对结果进行排序
对查询内容进行词法分析
区分查询内容中单词和关键字,比如:Apple and Phone, ” and”就是关键字,” Apple ”和”Phone”是普通单词。根据查询语法的语法规则形成一棵树
语言处理
跟创建索引时处理方式是一样的。比如:learned–>learn,driven–>drive
搜索索引得到结果,进行排序
第二步,搜索索引,得到符合语法树的文档集合
第三步,针对符合条件的文档结果,根据查询语句与文档的相关性,对结果进行排序,分数高比较越相关,排名就越靠前。