Lucence

来源:转载


Lucene 


概念:

全文检索是计算机程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当用户查询时根据建立的索引查找,类似于通过字典的检索字表查字的过程 

Demo

创建索引:使用indexWrtier 对象

 

      Lucene 到中存储的都是document 对象...

 

IndexWriterConfig IndexWriterConfig=new IndexWriterConfig(Version,Analyzer);

 

在创建索引的时候需要用到分词器,对文本当中的词进行提取,然后建立索引目录...

 

Analyzer  是一个抽象类,构造不同 的子类,相当于不同的分词规则....

indexWriter indexWriter=new indexWriter (Directory,IndexWriterConfig);

 

 可以往document 当中添加字段

 

indexableField 是一个接口,如果说要存储不同类型 的数据就构造不同的实现

 

StringFiled 与textField 都可以存储string 类型的数据,StringField 字段对应的值在索引库当中不分词,textField字段 对应的数据会被分词

 

 

更新索引:先删除,再创建1条

1:需要跟新那些document ,条件

2:需要更新的值.....

indexWriter.update(term,document)

indexWriter.update(query,document)

 

删除索引:

indexWriter.deleteAll();//清空索引

//根据单个字段对应的值删除

indexWriter.delete(new Term())

//删除符合条件的记录

 

indexWriter.delete(query);

 

 

 

 

 

搜索索引:使用indexSearcher 对象

 

 

IndexReader indexReader=DirectoryReader.open(“索引存放的目录”);

//接受索引读取器

IndexSearcher indexSearch=new IndexSearcher (IndexReader);

 

//Query 是查询条件,它是一个抽象类,构造不同的子类相当于不同的查询规则...

//总记录数,documentID

//检索的是索引目录.... ,检索索引目录的前面N条记录....

/**

1:   0,10

2:  10,10

3:  20,10

**/

Int fristResult ,int maxResult

 

TopDocs  topdocs =indexSearch.searcher(query,fristResult +maxResult);

Int endResult=比较查询到的总记录数与fristResult +maxResult 的 值,取小值

For(int i=fristResult ;i<endResult;i++){}

 

 

 

//这里面存放document 的id,还需要根据document id 检索到对应的document

ScoreDocs scoreDocs []=topdocs .scoreDocs;

Document document=indexSearch.doc(id);

//单个字段进行查询,不会对关键字进行分词

Query query=new TermQuery(new Term(“title”,”lucene 是”));

 

//多个字段查询...

//会对查询条件当中的关键字进行分词....

QueryParser queryPaser=new MultifieldQueryParser(Version,fields,analyzer);

 

Query query=queryPaser.parser(keywords);

 

//

 

 

我们可以使用图形化界面工具luke 打开索引库当中的数据,这个工具只支持lucene4.0 之前的版本。

 

 

分词器:

1:创建索引,搜索用到索引..

 

在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,否则可能会搜索不出结果。

 

Analyzer  是一个抽象类,切分词的具体规则由子类实现,我们可以改造分词器,来定义自己的分词规则...

 

1:单字分词:

Analyzer  analyzer=new StandardAnalyzer();

    2: 二分法分词

CJKAnalzyer analyzer=new CJKAnalzyer ();

 

3:词库分词,庖丁分词,第三方的实现....

  IKAnalzyer ikanalzer=new IKAnalzyer ();//可以自定义词库,停用词...

 

4:  得分.....  Seo 优化....

  

1,相关度得分是在查询时根据查询条件实进计算出来的

2,如果索引库数据不变,查询条件不变,查出的文档得分也不变

 

我们修改文档的得分,来影响结果的排列顺序.... 

1,通过代码修改每个字段对应的得分的权重值  setBoost();默认为1f

2:可以增加关键字在文章当中出现的次数。。

3:通过外链的方式增加点击次数...

 

 

 

索引优化: 在lucene 3.6 之后的版本 自动优化,我们也可以来手动进行修改....

 

   四种方式:

1:通过修改indexWriterConfig 对象来 设置 document 的合并规则

2:可以将硬盘上面的索引读取到内存当中来,然后我们检索索引的时候直接从内存当中获取索引目录,这样少了io 的操作,从而也提升了搜索的性能...(通过单例一次性读取..)

3:  通过创建索引的时候定义分词的规则....

4:  分区存放(新闻类的索引某个文件夹,图片的索引放在另外一个文件夹..)

 

爬虫:通过代码的方式抓取网页

 

urlConnecttion 可以发送一个http 请求....  www.sohu.com

Rss :信息聚合...

 

Robots 协议:

 

compass/solr

 

 

第二天:高亮器

对查询出来的结果(document)当中包含的关键字进行高亮...

//高亮显示的格式....

Formatter formatter=new SimpleHTMLFormatter("<font color='red'>", "</font>");

//跟query 条件进行关联,因为query 包含关键字,,这样高亮器才知道将文本当中那些关键字进行高亮

Scorer fragmentScorer=new QueryScorer(query);

//创建一个高亮器....

/**

 * 

 * 1:高亮显示的格式....

 * 

 *<font color='red'> 中国</font>达人秀

 * 

 */

Highlighter highlighter=new Highlighter(formatter, fragmentScorer);

 

Lucene 提供 api 是对document 的 字段 逐个逐个进行高亮。

 

 

 

 

过滤器

 

使用Filter可以对搜索结果进行过滤以获得更小范围的结果。使用Filter对性能的影响很大(有可能会使查询慢上百倍)。但也可使用相应的查询实现一样的效果

 

Filter  是一个抽象类,我们可以自定义过滤器,来改造属于自己的过滤规则...

 

 

查询条件

 

//第一种:单字段查询..

//字段对应的值没有被分词...

//Query query=new TermQuery(new Term("author", "zhangsanfeng"));

///第二种:多个字段查询,字段对应的值会被分词...

//QueryParser parser=new MultiFieldQueryParser(LuceneUtils.getCurrentVersion(),new String []{"title","content"},LuceneUtils.getAnalyzer());

//

//Query query=parser.parse("学好java");

//第三种://通配符查询

//? 代表单个字符,× 代表多个字符,

//Query query=new WildcardQuery(new Term("content", "ja*"));

//第四种//范围查询,使用此查询可以替代过滤器... 这种查询比过滤器的性能高...

//Query query=NumericRangeQuery.newIntRange("id", 1, 10, true, false);

//

//第五种查询  查询所有

//Query query=new MatchAllDocsQuery();

//第六种查询...

//模糊查询

/**

 * 1:为查询条件对象

 * 

 * 2:最大可编辑数,(允许查询条件错误几个字符)

 * maxEdits 的取值在0~ 2之间...

 * 

 * 

 */

FuzzyQuery fuzzyquery=new FuzzyQuery(new Term("author", "zhangsanfeng"),2);

////第七种短语查询...

PhraseQuery phraseQuery=new PhraseQuery();

//添加短语1 我们需要在短语的后面添加元素的角标...

phraseQuery.add(new Term("content", "学"));

//添加短语2

phraseQuery.add(new Term("content", "扑"));

//设置两个短语之间的最大间隔数...

phraseQuery.setSlop(1111111111);

//boolean 布尔查询

BooleanQuery booleanQuery=new BooleanQuery();

/**

 * 

 * 1:条件

 * 2:连接符(select × from table where  and or !=)

 */

booleanQuery.add(fuzzyquery, Occur.MUST);

booleanQuery.add(phraseQuery,Occur.MUST);

query(booleanQuery);

 

在做项目查询的时候,会首先对客户端传进来的关键字进行分词处理,然后通过各种查询条件进行组拼,把组拼查询条件放置到booleanquery 查询条件当中。

Solr: 的概念

  采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

 

         Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G Solret操作提出查找请求,并得到XML格式的返回结果。文件

Solr 服务器的运行:

 

跳转到solr 的解压目录:java  -jar  post.jar 来运行 jetty 服务器 ,因为这个是解压目录自带的..

 

客户端:我们可以通过图形化界面来向solr 服务器提交请求。。

http://localhost:8983/solr

 

我们可以同post.jar 工具可以将本地的*.xml 文件提交到solr 服务器当中,生成索引...

 

 

查询条件:

solr通过http以get的方式进行搜索数据,如:http://localhost:8983/solr/collection1/select?q=solr&wt=xml

q:查询的关键词(此时查询的字段是solrconfig.xml中指定的默认查询字段<str name=”df”>text</str>)

fl:搜索结果返回的字段

sort:排序

wt:搜索结果返回格式

q=video&fl=name,id (return only name and id fields) 

q=video&fl=name,id,score (return relevancy score as well) 

q=video&fl=*,score (return all stored fields, as well as relevancy score) 

q=video&sort=price desc&fl=name,id,price (add sort specification: sort by price descending) 

q=video&wt=json (return response in JSON format) 

 

 

使用solrj 操作 solr 服务...

 

    

 

两个文件介绍schema.xml,用来描述document的定义

Field 字段的属性 介绍 

fieldType  字段的类型

(创建索引时使用的分词器,搜索时使用的分词器)

 <copyField source=”cat” dest=”text”/>

实际项目中为了方便查询,我们会把多个需要查询的字段合并到一个字段里,方便查询。

DynamicField  

 

solfConfig.xml...(主要可以配置solr 索引库的存放位置,以及缓存机制,集群也是在这个文件当中进行配置...)

将数据库的数据导入到索引库当中....

修改solrconfig.xml,添加下面这段代码: 

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">

    <lst name="defaults">

      <str name="config">data-config.xml</str>

 </lst>

  </requestHandler>  

然后再solrconfig.xml文件统计的目录下新增上面声明的data-config.xml。内容如下: 

连接数据库的信息...

<?xml version="1.0" encoding="UTF-8" ?>  

<dataConfig>   

<dataSource type="JdbcDataSource"   

  driver="com.mysql.jdbc.Driver"   

  url="jdbc:mysql://localhost:3306/heima"   

  user="root"   

  password="123456"/>   

<document>   

<entity name="id" query="select id,name,manu from solr"></entity>   

</document>   

 

</dataConfig> 

 

 

因为需要连接数据库所以需要连接数据库的jar 包,以及操作索引库的jar 包,在collection 下面创建lib 目录将jar 包拷贝到lib 目录下 

solr-dataimporthandler-4.7.0,solr-dataimporthandler-extras-4.7.0以及连接mysql 的jar 包

 

 

 



分享给朋友:
您可能感兴趣的文章:
随机阅读: