Lucence
来源:互联网 发布:小学语文课文配音软件 编辑:程序博客网 时间:2024/05/16 05:34
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 包
- lucence
- lucence
- lucence
- lucence
- lucence
- Lucence
- Lucence
- lucence
- lucence简介&lucence示例
- lucence简介&lucence示例
- 配置lucence
- 了解lucence
- 搜索引擎lucence
- Lucence Resource
- lucence开发
- lucence小记
- lucence helloword
- lucence入门
- 数组 不支持 引用
- 图书管理系统开发研究
- 自定义导航栏背景颜色
- uva 1400 - "Ray, Pass me the dishes!"(线段树)
- shell——tr
- Lucence
- hdu 1054 树形dp
- Cocos2d-x内存管理机制
- Linux命令之uname -r
- Linux学习笔记(六)
- 精妙Sql语句(转)
- poj 1696Space Ant
- nginx 配置优化的几个参数
- HDU 1003 Max Sum 动态规划