lucene基础总结


使用Lucene进行全文检索的过程与数据库过程对比

一、创建索引
(1)、table--------IndexWriter-----通过它建立相应的索引表,相当于数据库中的table;

    Field相当于数据库中的列

(2)、在构建此索引表时需指定的为该索引表采用何种方式进行构建,也就是说对于其中的记录的字段以什么方式来进行格式的划分,Lucene中称为Analyzer
Lucene提供了几种环境下使用的Analyzer:
SimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等,
其中StandardAnalyzer是经常使用的,因为它提供了对于中文的支持


二、添加记录
(1)、在表建好后我们就需要往里面插入用于索引的记录,在Lucene中这个称为Document,有点类似数据库中table的一行记录
(2)、记录中的字段的添加方法,在Lucene中称为Field(Field相当于数据库中的列)
这个和数据库中基本一样,对于Field Lucene分为
可被索引的,
可切分的,
不可被切分的,
不可被索引的几种组合类型。

三、查询

(1)、首先是Query,Lucene提供了几种经常可以用到的Query:
TermQuery
、MultiTermQuery、MultiTermQuery、BooleanQuery、
WildcardQuery、PhraseQuery、PrefixQuery、
PhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQuery;
Query其实也就是指对于需要查询的字段采用什么样的方式进行查询,
如模糊查询、语义查询、短语查询、范围查询、组合查询等,
还有就是QueryParser,QueryParser可用于创建不同的Query,
还有一个MultiFieldQueryParser支持对于多个字段进行同一关键字的查询

TermRangeQuery是用于字符串范围查询的,字符串比较大小其实比较的是ASC码值,一般数字范围查询NumericRangeQuery用的比较多一点,中文汉字进行ASC码值比较没什么太大意义。

注:Field相当于数据库中的列

TermQuery-----------词条搜索
代码示例:
Term t = new Term(要搜索的Field, 搜索关键词);
  Query query = new TermQuery(t);

BooleanQuery--------组合搜索
代码示例:
BooleanQuery q = new BooleanQuery();
q.Add(q1, Occur.MUST);
q.Add(q2, Occur.MUST);

NumericRangeQuery、TermRangeQuery-------范围搜索(但是TermRangeQuery执行效率很慢,基本没用了)
代码示例:
TermRangeQuery q = new TermRangeQuery("Age", "0", "18", true, true);
NumericField(Field名称, 有效数字, 是否存储, 是否会用于搜索);
NumericRangeQuery通过其静态方法创建:
NumericRangeQuery.NewIntRange(要检索的字段名, 起始范围, 结束范围, 是否包含左边界, 是否包含右边界);

PrefixQuery--------前缀搜索(好像只支持英文,中文好像还不支持)
代码示例:
Term t = new Term("Name","d");
PrefixQuery query = new PrefixQuery(t);

PhraseQuery---------短语搜索(注意这种搜索类型中可以设置匹配度)
代码示例:
Term t1 = new Term("title", "附");
Term t2 = new Term("title", "城");
PhraseQuery query = new PhraseQuery();
query.Slop = 1; //设置间隔的字符数量
query.Add(t1);
query.Add(t2);
TopDocs docs = searcher.Search(query, null, 10);

MultiPhraseQuery-----------多短语搜索
代码示例:
指定“飞”作为统一前缀,然后指定“鸟”,“机”作为后缀,Lucene会自动组成“飞鸟”,“飞机”两个词进行搜索
Term t1 = new Term("title", "飞");
Term t2 = new Term("title", "机");
Term t3 = new Term("title", "鸟");
MultiPhraseQuery query = new MultiPhraseQuery();
query.Slop = 3; //这个设置依然生效,如果启用这行代码,则3条记录都出来
query.Add(t1);
query.Add(new Term[] { t2, t3 });

FuzzyQuery-------------模糊搜索

模糊搜索就是FuzzyQuery类,用于英文搜索。如果两个词的词形相似,那么可以设定匹配度,从而搜索出结果。
  在创建FuzzyQuery的时候,有个重载构造方法可以输入一个float类型的模糊度。这个值越小,搜索的模糊性越强,搜索出来的结果越多。
代码示例:
比如,"good"与"god"不一样,搜索"good"和搜索"god"会得到不同的结果。但是,如果使用了FuzzyQuery类,就可以使得搜索引擎把用户输入的"good"当做"god"去处理
Term t1 = new Term("title", "god");
FuzzyQuery query = new FuzzyQuery(t1,0.5f);
TopDocs docs = searcher.Search(query, null, 10); //得到 god与good

WildcardQuery------------通配符搜索(通常用“*”表示任意多个字符,用“?”表示任意一个字符)
代码示例:
Term t = new Term("title", "飞*");
WildcardQuery query = new WildcardQuery(t);

注意:像这种搜索,如果是经过分词的结果,那么没有什么意义,相当于直接普通搜索一个“飞”,
通常用于搜索没经过分词的Field。如果没经过分词的,上面的搜索,相当于搜索长度是2,而且以飞开始的Field。


(2)、IndexSearcher概念指的为需要对何目录下的索引文件进行何种方式的分析的查询,
有点象对数据库的哪种索引表进行查询并按一定方式进行记录中字段的分解查询的概念,
通过IndexSearcher以及Query即可查询出需要的结果,
Lucene返回的为Hits.通过遍历Hits可获取返回的结果的Document,通过Document则可获取Field中的相关信息了(新版本中hits已经被弃用了,使用TopDocs)

 

注意方法和词汇:

QueryParser 中的DefaultOperator 是设置关键词中空格之间的关系,即存在空格时,空格之间的词是与、或的关系

例子:

QueryParser parser = new QueryParser("title",aStandardAnalyzer);
parser.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
parser.setDefaultOperator(QueryParser.AND_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"与"

BooleanQuery它能进行组合查询(组合查询就是 将其他类型的查询组合在一起 查询)

MUST和MUST表示“与”的关系,即“并集”。
MUST和MUST_NOT前者包含后者不包含。
MUST_NOT和MUST_NOT没意义
SHOULD与MUST表示MUST,SHOULD失去意义;
SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
SHOULD与SHOULD表示“或”的概念。

建立BooleanQuery对象。使用BooleanQuery对象的Add方法将Query对象添加进来。第一个参数是Query对象,第二个参数是该Query对象的逻辑表达式,
对于这个参数,有三个取值:
Occur.MUST:表示搜索结果必须满足该Term;
Occur.MUST_NOT:表示搜索结果不需满足该Term;
Occur.SHOULD:表示搜索结果可以满足该Term;

例子:
BooleanQuery rootQuery = new BooleanQuery();

rootQuery.add(query1, BooleanClause.Occur.MUST);
rootQuery.add(query2, BooleanClause.Occur.MUST);

表示query1 和 query2 进行组合查询,标识 将两个的 query1和query2相"与"查询

 

posted @ 2017-04-13 18:01  坏笑的眼镜男  阅读(221)  评论(0)    收藏  举报