注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老狗的博客

尽管每一步都很微小,但我确认我在进步

 
 
 

日志

 
 
关于我
sky

认真生活,努力工作 热爱技术,关注DB,存储,分布式,中间层,java,c++,php

网易考拉推荐

lucene 查询过程分析  

2012-05-10 19:26:43|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

lucene 查询过程分析 - sky - 老狗的博客
 
从以上搜索过程的描述来看,查询过程主要有以下几个类来完成

 IndexWriter

public class IndexWriter
extends Object
implements Closeable, TwoPhaseCommit

构造函数如下:
public IndexWriter(Directory d,  IndexWriterConfig conf) throws CorruptIndexException,LockObtainFailedException,IOException
参数介绍:
d: 索引目录
conf : 配置设置,根据这个配置,indexwriter进行初始化

IndexWrtierConfig

public final class IndexWriterConfig extends Object implements Cloneable
功能:保存IndexWriter的所有配置,你应该初始化这个类,调用setters设置你的配置,然后把它传递给IndexWriter,  支持链式设置

构造函数:
Public IndexWriter Config(Version matchVersion, Analyzer analyzer)
参数介绍:
matchVersion: 指定版本,不同版本有不同的merge 策略
analyzer: 指定分词器

public IndexWriterConfig setRAMBufferSizeMB(double ramBufferSizeMB)
功能:设置用来缓冲added documents, deletions 缓冲的大小,当达到设定的这个值,就会被flush到磁盘上,最好设置这个,而不是通过设置条数

IndexReader

public static IndexReader open(IndexWriter writer,boolean applyAllDeletes) throws CorruptIndexException,IoException
参数介绍:
writer : 用来更新倒排索引的IndexWriter
applyAllDeletes : 是否将缓存的deletes提交到索引中去,这个操作比较耗时
常用方法介绍:
public static IndexReader openIfChanged(IndexReader oldreader) throws IoException
如果oldreader自从上次改变之后改变过,则重新打开,否则,返回null
需要注意的是:IndexReader一旦打开,其数据则为静态,所以为了查询最新更新到的数据,必须定时的重新打开
IndexSearcher

//构造函数
public IndexSearcher(IndexReader r)
使用打开的IndexReader构造IndexSearcher
public IndexSearcher(IndexReader r,ExecutorService executor)
使用打开的IndexReader构造IndexSearcher,线程池executor用来对倒排索引的段进行并发扫描,默认串行扫描,最终线程池需要用户自己管制,IndexSearcher并不负责关闭,需要注意IndexSearcher是线程安全的,也就是说多个线程可以并发的使用一个indexsearcher
//常用api
public Document doc(int docID)
根据document的逻辑主键docid返回对应的Document
public TopDocs search(Query query, int n)
返回query所对应的前n条得分最高的查询
public void search(Query query, Collector results)
对每个匹配的docid,调用Collector.collect(int),这个Collect的构造还是有技巧的,如TopScoreDocCollector collector = TopScoreDocCollector.create((int) (offset + rows), false);
SearchManager
public final class SearcherManager extends object
这个类的用途是在多个线程间安全的共享IndexSearcher,在周期性的进行reopen操作的同时,保证每个seracher仅被关闭一次
除此之外,你应该周期性的调用maybeReopen(),  最好是用一个后台线程周期性的调用,一旦用完,要用close()进行关闭
public IndexSearcher acquire()
public void release(IndexSearcher searcher)
public void close()
boolean maybeReopen()
 Analyer


An Analyzer builds TokenStreams, which analyze text. It thus represents a policy for extracting index terms from text.

analyzer用来构建TokenStreams, 它用来分析文本,表示一种从文本中提取term进行索引的策略

Typical implementations first build a Tokenizer, which breaks the stream of characters from the Reader into raw Tokens. One or more TokenFilters may then be applied to the output of the Tokenizer.

典型的实现方法是构建一个Tokenizer, 将来自Reader的字符流打散成原始的Tokens,一个或者多个TokenFilters可以使用于Tokenizer的输出

常见的分词器:
英文分词器:StandardAnalyzer
支持中文的双字分词器:CJKAnalyzer/n-gram Analyzer
中文分词器:ik-analyzer,paoding

Query

Query用来,以lucene理解的方式,描述用户的搜索意向的抽象类
子类有:
1. TermQuery:

2. PhraseQuery
A Query that matches documents containing a particular sequence of terms.
也就是说
另外对于phraseQuery还有一个slop的概念,就是滑动距离,默认为0,在文档中PhraseQuery中的词汇必须顺序出现

如果query的序列为field:hello  field:world

document: hello china world
如果要匹配就要设置slop为1
document field:world china hello
如果要匹配就要设置slop为3

3. NGramPhraseQuery

This is a PhraseQuery which is optimized for n-gram phrase query. For example, when you query "ABCD" on a 2-gram field, you may want to use NGramPhraseQuery rather than PhraseQuery, because NGramPhraseQuery will rewrite(IndexReader) the query to "AB/0 CD/2", whilePhraseQuery will query "AB/0 BC/1 CD/2" (where term/position)
可以对于n-gram phrase query做一些优化,如采用了二元切词,则ABCD会被切分为AB0/BC1/CD2,则如果是为了做到db的全模糊查询,则会将AB,BC,CD放入PhraseQuery中,设置slop为0进行查询,则如果采用NGramQuery,则采用rewrite优化后,则为AB/0 CD/2代替前面的,原理的话,应该是采用PhraseQuery,设置slop为1

4. QueryParser

5. TopScoreDocCollector

  评论这张
 
阅读(634)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018