luene

什么是全文检索


   第一个 快速  通过建立索引的方式来达到快速的方式 
   第二个 准确  通过相关度 .
   第三个 只处理文本 不负责语义  例如: 你妈是谁? 它会通过关键词来分解 进行查询..


在百度中有服务器 是专门 用来存放索引的 它会通过爬虫来抓取互联网的东西 然后创建索引..
你输入你妈是谁? 它就会去百度的服务器中找 看有没有..


利用API 操作全文检索


   indexWriter  
         创建indexWriter 对象
                
                1.索引库所在的 磁盘 位置 DIrectory 
                
                2. 分词器
                
                3. 字段的最大长度
                
          addDocument(doc) document  --->相当于数据库中table 
          
          updateDocument(term,doc) 第一个参数是用来 参数 第二次参数用来删除
          
          delteDocument(term) 通过 关键字来删除.
          
          一个索引库只能 用一个indexWriter 进行操作
          如果indexWriter没有关掉, 在索引库中会产生一个write.lock文件 相当于上锁
          
   indexSearch
   
        indexSearch searche  先区目录库中查找  返回 TOPDOCS
         
         TopDocs
              1.ScoreDocs[]  这个一个数据 每一个元素 代表一行记录 1, lunes 一行目录的对象
                  1.doc 获得索引值   -->通过 indexSerach.doc(doc)  就能获得这一行的doc对象...
                  
                  2. 获得相关度得分 
              
              2. totoalHists 这个是总的记录数
      
              
优化
  手动  合并
  自动
  
内存和文件索引库是怎么结合在一起工作的..
  
                 


lunces 是 它的一个框架


高亮


-----------------------------------------------------------------


分词器
1.英文分词器
      TokenStream tokenStream=analyzer.tokenStream("aa",new StringReader(text));
    tokenStream.addAttribute(TermAttribute.class);
    while(tokenStream.incrementToken()){
    TermAttribute termAttribute=tokenStream.getAttribute(TermAttribute.class);
    System.err.println(termAttribute);
    }


    *切分关键词
    *停用关键词
    *把大写转换成小写
2中文分词器
    1单字分词器
     Analyzer analyzer=new ChineseAnalyzer();
    String s="你是傻B吗?";
    this.testEnAnalyer(analyzer, s);
    
    2二分法
     Analyzer analyzer=new  CJKAnalyzer(Version.LUCENE_30);
    String s="你是傻B吗?";
    this.testEnAnalyer(analyzer, s);
    
    3IK 利用词库分词 
     Analyzer analyzer=new   IKAnalyzer();
    String s="大叼哥哥";
    this.testEnAnalyer(analyzer, s);
     Configuration configuration=new Configuration();
     Session session=configuration.buildSessionFactory().openSession();
     Query query=session.createQuery("");
     query.setFetchSize(10);// 每一页的第一行在结果集中的行数
     query.setMaxResults(15);
    
     还可以自己扩充词库
    
    
<properties>  
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典
<entry key="ext_dict">/mydict.dic; /mypack/mydict2.dic ; /com/mycompany/dic/mydict3.dic ;</entry> 
--> 
<!--用户可以在这里配置自己的扩展停止词字典
<entry key="ext_stopwords">/ext_stopword.dic</entry> 


-->
</properties>


2. 查询索引器


    1.分页.. 不解释 因为我不会..
    
    2 按照条件进行查询
    
      使用关键字
                Term term = new Term("id", "2");
Query query = new TermQuery(term);
this.test(query);
      全部查询 所有文档
             Query query = new MatchAllDocsQuery();
             
      范围和通配符
      
       Query query = NumericRangeQuery.newIntRange("id", 10, 20, true, true);
this.test(query);
     这里有个转换 从int 到nubernic转换
     从int 到string
     Field idField = new Field("id", NumericUtils.intToPrefixCoded(article.getId()), Store.YES, Index.ANALYZED_NO_NORMS);
       从String 到int
     article.setId(NumericUtils.prefixCodedToInt(document.get("id")));

   >>
   // 因为在查询的过程没有分词器的加入所以它区分大小写
Term term = new Term("title", "L*");
Query query = new WildcardQuery(term);
this.test(query);

    短语查询
        Term term = new Term("content", "baidu");
Term term1 = new Term("content", "baidu");
PhraseQuery query = new PhraseQuery();
query.add(term, 0);
query.add(term1, 1);
this.test(query);
    boolean 查询
           BooleanQuery query = new BooleanQuery();
Term term = new Term("content", "baidu");
Term term1 = new Term("content", "aaa");
TermQuery termQuery = new TermQuery(term);
TermQuery termQuery1 = new TermQuery(term1);
query.add(termQuery, Occur.MUST);// 必须满足
this.test(query);
三: 进行排序


     **按照相关度进行排序
     
     注意: 可以手动调节相关度得分 利用setBost() 百度就是这么赚钱....
     
     **按照字段的高低进行排序
四:高亮器
     1.是关键字的颜色和其他字的颜色区分..
     2.控制摘要的显示长度
  IndexSearcher indexSearcher = new IndexSearcher(LunceneConfig.directory);
List<Article> articles = new ArrayList<Article>();
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,
new String[] { "content", "baidu" }, LunceneConfig.analyzer);
Query query = queryParser.parse("baidu");
TopDocs topDocs = indexSearcher.search(query, 10);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;// 索引库的数组
int count = topDocs.totalHits;// 总的记录数
/**
* 高亮的配置 1.创建 preTag前缀后后缀 postTag
*/
Formatter formatter = new SimpleHTMLFormatter("<font color='blue'>",
"</font>");
// 放置关键字 给这个高两字放置关键字
Scorer scorer = new QueryScorer(query);
// 告诉高亮器那个子是关键子
Highlighter highlighter = new Highlighter(formatter, scorer);
/**
* 设置摘要 SimpleFragmenter 构造函数里面的int型参数规定摘要的大小
*/
Fragmenter fragmenter = new SimpleFragmenter(5);
highlighter.setTextFragmenter(fragmenter);



for (int i = 0; i < scoreDocs.length; i++) {
int index = scoreDocs[i].doc;
float score = scoreDocs[i].score;// 相关度得分
Document document = indexSearcher.doc(index);
String textHighlighter = highlighter.getBestFragment(
LunceneConfig.analyzer, "content", document.get("content"));
document.getField("content").setValue(textHighlighter);
Article article = DocumentUtils.document2Article(document);
articles.add(article);
}
for (Article article : articles) {
System.err.println(article.getId());
System.err.println(article.getTitle());
System.err.println(article.getContent());
}
}
------------------------------------------------------------------------------------------
compass 很重要 不会的话 很严重..


步骤:
 1. 加入jar包
 2. 加入compass.cfg.xml 
    -指明索引库所在位置
    <compass name="default">
      <!-- 连接到索引库 -->
      <connection>
      <file path="./indexDir"></file>
      </connection>
    -指明索引类所在的位置
    <mappings>
   <class name="com.compass.HelloWorld"></class>
   </mappings>
   </compass>
3 在索引类 标注解
@Searchable 
在类上
id上
@SearchableId
public Integer getId() {
普通
@SearchableProperty
public String getContent() {


    
     
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值