`
tigers20010
  • 浏览: 47559 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

2010-01-05 传智播客—luncene/compass (二)(转载)

阅读更多

如果大家对文章内容有不理解的地方,尽情留言或QQ(1357208561) 讨论。让大家共同进步。

                                                                                                                                                                                                                                                                                               ————tigers20010

 

 

 

3.排序(默认相关度排序)

a)          实验相关度排序,得分是在搜索时算出来的。

b)         影响区域

i.           整个文档

ii.          某个字段

1.          建立索引时,影响它的排名,创建QueryParser时指定“MultiFieldQueryParser(String[] fields, Analyzer analyzer, Map boosts)”中第三个参数为“new HashMap<String, Float>().put(String fieldname, float fraction)”提升对应字段内容的排名。一般网站内部搜索会将标题部分的内容提升,以至于标题内容的排名大于帖子内容或回复的排名。

2.          搜索时,标题与内容的含量排名,TopDoc有一个score属性,它是根据文档中关键字的数量,记录文档的得分。

c)   按指定的字段进行排序,就是在搜索时,指定的字段。

d)   Sort排序器,由类Sort实现。

Sort sort = new Sort();

sort.setSort(SortField field);

indexSearcher.search(query, null, 100, sort);

 

4.过滤器

在查询时添加一个过滤器,过滤掉查询后不想要的内容,由Filter接口实现。

String lower = NumberTools.longToString(3);

String upper = NumberTools.longToString(6);

Filter filter = new RangeFilter("id", lower, upper, true, false);

indexSearcher.search(query, filter, 100);

lucene中使用数值、日期数据时,必须使用NumberToolsDateTools。前后必须统一,比如使用longToStringLong转换为String,那么也必须使用stringToLongString转换为Long

 

5.搜索,Query的子类对应各种查询:

1)         TermQuery,关键词查询:

Term term = new Term("context", "加油");

Query query = new TermQuery(term);

indexSearcher.search(query, null, 100);

2)         RangeQuery,范围查询:

Term lower = new Term("content", NumberTools.longToString(3));

Term upper = new Term("content", NumberTools.longToString(10));

Query query = new RangeQuery(lower, upper, false/*包含边界*/);

indexSearcher.search(query, null, 100);

3)         WildcardQuery,通配符查询:

Term term = new Term("context", "?");//?匹配任意一个字符,*代表任意多个字符。

Query query = new TermQuery(term);

indexSearcher.search(query, null, 100);

indexSearcher.search(query, null, 100);

4)         PhraseQuery,短语查询:

PhraseQuery phraseQuery = new PhraseQuery();

phraseQuery.add(new Term("context", "中国人民"));

phraseQuery.add(new Term("context", "加油"));

phraseQuery.setSlop(5); // 指定关键词之间间隔的字符的最大数量

indexSearcher.search(query, null, 100);

5)         BooleanQuery,布尔查询:

Query query1 = new TermQuery(new Term("context", "中国人民"));

Query query2 = new TermQuery(new Term("context", "加油"));

BooleanQuery boolQuery = new BooleanQuery();

boolQuery.add(query1, Occur.MUST);

boolQuery.add(query2, Occur.SHOULD);//Occur的常量值:MUSTSHOULDMUST_NOT

indexSearcher.search(query, null, 100);

注意:经过分词器的所有字母,无论是添加索引还是查询,都会被转换为小写的。但上边这些查询类没有经过分词器,如果查询关键里有大写字母,将查询不到匹配的结果。所以在使用上边这些查询类时,查询文本中的字母全部为小写。我们之前使用的查询是通过QueryParser切分出查询关键字,所以使用QueryParser可以不注意大小写问题。

二、Compass

Compasslucene的框架,它与hibernate极其相似(但不具有hibernate那些高级功能,比如缓存技术)。汤兄弟做的好,因为学习lucene之前的课程正是hibernate,他将hibernatecompass对比了一下,使我们学习compass更加容易了。OK,我总结一下。

1.hibernatecompass

 
 

 

 
 

 

 


hibernate

compass

配置方式

1.编程方式:

  Configuation cfg = new Configu...();

  cfg.set...();

  ...

2.配置文件:

  //默认配置,文件名为“hibernate.cfg.xml

  Configuation cfg= new Configu...();

//指定文件名(文件名可变更)

//cfg.configure("hibernate.cfg.xml");

1.编程方式:

  CompassConfiguation cfg = new CompassConf...();

  cfg.set("key","value");

  ...

2.配置文件

  //默认配置,文件名为“compass.cfg.xml

  cfg.configure();

  //指定文件名(文件名可变更)

  cfg.configure("hibernate.cfg.xml");

配置文件

XML文件

注解

XML文件

注解

 

2.compass中的注解配置

package cn.itcast.cc.compass;

 

import org.compass.annotations.Index;

import org.compass.annotations.Searchable;

import org.compass.annotations.SearchableId;

import org.compass.annotations.SearchableProperty;

import org.compass.annotations.Store;

 

@Searchable

public class Article {

    private Long id;

    private String title;

    private String content;

    @SearchableId

    public Long getId() { return id;}

    @SearchableProperty(store = Store.YES, index = Index.ANALYZED, boost = 2.0F, excludeFromAll = ExcludeFromAll.YES/*这个属性的内容被查询忽略*/)

    public String getTitle() {return title;}

    @SearchableProperty(store = Store.YES, index = Index.ANALYZED)

    public String getContent() {return content;}

    public void setId(Long id) {this.id = id;}

    public void setTitle(String title) {this.title = title;}

    public void setContent(String content) {this.content = content;}

}

XML配置文件,可以查看“compass-2.2.0-M2/docs/reference/html_single/index.html”手册,内容较多。

3.compassAPI

CompassConfiguration cfg = new CompassConfiguration();

cfg.setConnection("./indexPath/");// 连接信息

cfg.addClass(Article.class);// 声明映射信息

Compass compassSessionFactory = cfg.buildCompass();

CompassTransaction tx = session.beginTransaction();

session.create(article);

tx.commit();

session.close();

其他API

session.find(String arg0);

session.save(Object arg0);

session.delete(Class arg0, Object arg1);

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics