lucene、compass

lucene


站内搜索

搜索功能很常见。
搜索是从一大堆资源中快速准确的找出想要的数据。


全文检索的定义:
1,搜索的都是文本
2,不处理语义,方式是找出含有指定词的文本。


特点
a,不区分英文的大小写。
b,
1,搜索效果的问题,要准确。
2,相关度排序(按相关度得分排序,相关度是指结某对搜索条件的匹配程度)
3,速度。


搜索ant

Select * From t_article Where title like '%ant%' OR content like '%ant%'

ant
planting


ant's
ant is ...
ant.




Select * from ...;



class ArticleAction extends ActionSupport{

public String add(){
dao.save(article); // 保存到数据库
indexDao.save(article); // 保存到索引库
}

public String delete(){
id = req.getParameter("id");
dao.delete(id); // 从数据库中删除
indexDao.delete(id); // 从索引库中删除
}

public String update(){
dao.update(article); // 更新到数据库
indexDao.update(article); // 更新到索引库
}

}



按数据源分类
1,源数据在数据库中
1,自己可以检测到对数据源的增删改,就写代码也同时做索引库的增删改。(自己写新程序)
2,自己不可以检测到对数据源的增删改,就采用定时重建索引库的方式。(老程序且不让改源代码)
2,源数据在互联网中(需要用爬虫工具抓取网页数据)
采用定时重新抓取与建立索引的方式。
3,源数据在文件中
采用定时重建索引库的方式。



limit ?,?
.setFirstResult(int)
.setMaxresults(int)


假设共有25条记录,每页显示10条,则共3天

first max
第1页 0 10
第2页 10 10
第3页 20 10

-------------------------------------
一、分词器
1,在建立索引(Index.ANALYZED)与搜索(QueryParser)时都会用到分词器,应使用同一个。
2,对英文的处理
3,中文分词器

原文:An IndexWriter creates and maintains an index.
indexwriter
creates
maintains
index


二、搜索
1,高亮
2,排序
1,按相关度排序(doc.setBoost(1F))
2,按指定的字段值排序(与Order By类似)
3,过滤
4,查询
1,查询字符串 + QueryParser (--> Query对象)
可以查询语法,会用到分词器
2,直接构建Query对象
不可以写查询语法,不会用到分词器




<font color='red'>keyword</font>

lucene、compass_第1张图片 lucene、compass_第2张图片 lucene、compass_第3张图片 lucene、compass_第4张图片 lucene、compass_第5张图片 lucene、compass_第6张图片

compass

Hibernate JDBC 数据库
Compass Lucene 索引库



CompassConfiguration
Compass
CompassSession
CompassTransaction
CompassQuery
...

Compass 2.2 --> Lucene2.4



Configuration cfg = new Configuration().configure(); // hibernate.cfg.xml
SessionFactory sf = cfg.buildSessionFactory();

Session session = sf.openSession();
Transaction tx = session.beginTransaction();
session.......
save()
update()
saveOrUpdate()
delete()
...
tx.commit();
session.close();




CompassConfiguration cfg = new CompassConfiguration().configure(); // compass.cfg.xml
Compass sf = cfg.buildCompass();

CompassSession session = sf.openSession();
CompassTransaction tx = session.beginTransaction();
session.......
create() 建立索引
save() 保存或更新
delete()
get()/load()
...
tx.commit();
session.close();



<class name="Article" table="t_article">
<id name="">
..
</id>
<property name="" column="" type="" length="" not-null="" ..>
...




@HibernateEntity(table = "t_article")
public class Article {
@Id(type="int", column="id")
private Integer id;
@Property(column="", type="", length="" ...)
private String title;
private String content;


public static void main(String[] args) {
String className = "cn.itcast._domain.Article";

// clazz.getFields()
// clazz.getDeclaredMethods();
Class clazz = Class.forName(className);
Field field = null;
Method method = null;

clazz.getAnnotations();
clazz.getAnnotation(annotationClass);

field.getAnnotations();
field.getAnnotation(annotationClass);

method.getAnnotations();
method.getAnnotation(annotationClass);
}




1,基本概念
2,HelloWorld(建立索引、搜索)
3,IndexDao(使用Compass实现)
4,配置
1,高亮器的配置与使用
2,分词器的配置
5,搜索
1,排序 (Document.setBoost(1.0F))
2,过滤
3,各种查询
查询所有
关键词查询
范围查询
通配符查询
模糊查询
短语查询
布尔查询


1,在类上有 @Searchable
2,类中必须有唯一标识符属性,其上写 @SearchableId (这个属性是在删除与更新时用的)
3,其他属性使用 @SearchableProperty

@SearchableBoostProperty



CompassTemplate

HibernateTemplate

lucene、compass_第7张图片

笔记

一、整体说明(与Hibernate的对比说明)
1,整体结构
1,应用程序与框架交互(API)
2,框架与索引库交互(配置:主配置文件 + 映射信息)
2,API
1,模板代码
2,功能代码
3,配置
1,主配置文件,就是 key = value 的配置集合。
2,映射信息,有两种方式:
1,映射文件(xml文件)
2,注解

二、HelloWorld
1,准备场景
1,建立索引
2,搜索
2,添加Compass环境,Compass 2.2 (Lucene 2.4)
1,添加jar包
1,dist/compass-2.2.0.jar
2,dist/commons-logging.jar
3,dist/lucene/ 下的所有(6个)jar包
2,配置文件
1,在src下创建一个空的xml文件,名为 compass.cfg.xml
2,打开Compass文档,从第3.2章拷贝配置模板。
3,完成Compass有关的功能
1,完成建立索引的功能
2,完成搜索的功能
3,映射Article
1,在类上声明@Searchable
2,要有主键,声明@SearchableId(起唯一标识作用的,在删除与更新时用)
3,其他属性使用@SearchableProperty,可以指定:
1,Store(NO、YES)
2,Index(NO、ANALYZED、NOT_ANALYZED)
4,要有默认的构造方法(Compass用的,通过反射生成实例)
4,完成 compass.cfg.xml 中的配置
<!-- 1, 连接信息 -->
<connection>
<file path="./indexDir/" />
</connection>
<!-- 2, 映射信息 -->
<mappings>
<class name="cn.itcast.compass.domain.Article" />
</mappings>
<!-- 3, 其他配置
<settings>
<setting name="" value="" />
</settings> -->

三、IndexDao
1,IndexDao使用的方法与Lucene中说明IndexDao的一致,不一致的只是其中的方法的实现(使用Compass实现)
2,功能
1,建立索引:session.create(article)
2,删除索引:session.delete(Article.class, id)
3,更新索引:session.save(article)
4,搜索(分页)
1,CompassHits hits = session.find(queryString); // 查询
2,for (int i = firstResult; i < Math.min(firstResult + maxResults, hits.length()); i++) { ... } // 取一段数据
3,Article article = (Article) hits.data(i); // 取出数据

四,其他配置
1,高亮器(高亮器的配置与使用)
1,配置,在xml文件中的特殊字符要进行转义,如'<'要写成'&lt;'、'>'要写成'&gt;'
1,摘要的大小(字符数量):
<setting name="compass.engine.highlighter.default.fragmenter.simple.size" value="20" />
2,高亮的效果,前缀:
<setting name="compass.engine.highlighter.default.formatter.simple.pre" value="&lt;font color='red'&gt;" />
3,高亮的效果,后缀:
<setting name="compass.engine.highlighter.default.formatter.simple.post" value="&lt;/font&gt;" />
2,使用高亮器,一次高亮一个属性:
1,代码:String text = hits.highlighter(i).fragment("content");
2,说明:返回高亮后的摘要,如果当前属性值中没出理搜索的关键词,返回null
2,分词器
1,默认使用 StandardAnalzyer(对于中文是单字分词)
2,配置中文分词器(IKAnalyzer2.0.20):
<setting name="compass.engine.analyzer.default.type" value="org.mira.lucene.analysis.IK_CAnalyzer" />
1,修改停用词是修改jar包中的 /dict/noisechar.dic
2,扩展词库是修改jar包中的 /dict/local/local.dic

如果是JE分词,则....

五,搜索
1,排序
1,相关度排序(默认),也可以通过boost属性影响相关度得分
1,用一个float型的属性,加上注解:@SearchableBoostProperty
2,把默认值设为 1F。
2,按字段排序(升序、降序;一个、多个)
1,CompassQuery.addSort("id"); // 按id升序排列
2,CompassQuery.addSort("id", SortDirection.REVERSE); // 按id降序排列
2,补充
1,关于主键(@SearchableId):
1,默认主键不能被搜索,如果要搜索主键,则需要在主键的声明中指定name属性,例:@SearchableId(name="id")
2,searableId是起唯一标识作用的,但是并不强制不能重复,因为Lucene中没有此限制。
2,对于数字,Compass保存的是toString()的值。需要指定format="000000000",表示数字转成的字符串后的位数,不足长度则在前面用若干个"0"补齐。
3,搜索范围:
1,默认的搜索范围是所有可搜索属性。
2,可以在@SearchableProperty中指定"excludeFromAll = ExcludeFromAll.YES",以指定不搜索当前字段。
3,过滤
1,CompassQueryFilter filter = session.queryFilterBuilder().between("id", 1L, 15L, true, false);
2,CompassQuery.setFilter(filter);
4,各种查询
1,CompassHits hits = query.hits();
2,queryString + 查询语法
CompassQuery query = session.queryBuilder().queryString(queryString).toQuery();
3,CompassQuery:
1,关键词查询
2,范围查询
3,通配符查询
4,短语查询
5,布尔查询
1,关键词查询
CompassQuery query = session.queryBuilder().term("title", "lucene");
2,范围查询
CompassQuery query = session.queryBuilder().between("id", 5L, 15L, false);
3,通配符查询
CompassQuery query = session.queryBuilder().wildcard("tilte", "l?cen*");
4,短语查询
CompassQuery query = session.queryBuilder().multiPhrase("content")// CompassMultiPhraseQueryBuilder
.add("我们", 0)//
.add("lucene", 2)//
.toQuery();
CompassQuery query = session.queryBuilder().multiPhrase("content")//
.add("我们")//
.add("lucene")//
.setSlop(3)//
.toQuery();
5,布尔查询
1,CompassBooleanQueryBuilder booleanQueryBuilder = session.queryBuilder().bool();
2,booleanQueryBuilder.addMust(query); // MUST
3,booleanQueryBuilder.addMustNot(query); // MUST_NOT
4,booleanQueryBuilder.addShould(query); // SHOULD
5,CompassQuery query = booleanQueryBuilder.toQuery();

你可能感兴趣的:(compass)