什么是全文检索
第一个 快速 通过建立索引的方式来达到快速的方式
第二个 准确 通过相关度 .
第三个 只处理文本 不负责语义 例如: 你妈是谁? 它会通过关键词来分解 进行查询..
在百度中有服务器 是专门 用来存放索引的 它会通过爬虫来抓取互联网的东西 然后创建索引..
你输入你妈是谁? 它就会去百度的服务器中找 看有没有..
利用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() {
第一个 快速 通过建立索引的方式来达到快速的方式
第二个 准确 通过相关度 .
第三个 只处理文本 不负责语义 例如: 你妈是谁? 它会通过关键词来分解 进行查询..
在百度中有服务器 是专门 用来存放索引的 它会通过爬虫来抓取互联网的东西 然后创建索引..
你输入你妈是谁? 它就会去百度的服务器中找 看有没有..
利用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() {