以下文章主要介绍的是如何进行Lucene进行中文分词和全文搜索
package com.sf.module.extension.lucene;
import java.io.File;
import java.io.Serializable;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.LimitTokenCountAnalyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.LogMergePolicy;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.AttributeImpl;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.IKSegmentation;
import org.wltea.analyzer.Lexeme;
import org.wltea.analyzer.dic.Dictionary;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;
public class LuceneUtils {
public static boolean add(String indexPath, String lucenceKey, LuceneDB value) {
Analyzer analyzer = new IKAnalyzer();
try {
File file = new File(indexPath);
Directory dir = FSDirectory.open(file);
String lucene_pk = value.getDbtable() + "_" + value.getPk();
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_31, analyzer);
// delete exists index
try {
IndexReader reader = IndexReader.open(dir, false);
Term pkTerm = new Term("lucene_pk", lucene_pk);
reader.deleteDocuments(pkTerm);
reader.close();
} catch (Exception e) {
// fix file not exist
}
// create index
IndexWriter writer = new IndexWriter(dir, config);
writer.setMergeFactor(100);
writer.setMaxBufferedDocs(100);
Document doc = new Document();
Field content = new Field(lucenceKey, value.getConetnt(), Field.Store.YES, Field.Index.ANALYZED);
doc.add(content);
doc.add(new Field("pk", String.valueOf(value.getPk()), Field.Store.YES, Field.Index.NO));
doc.add(new Field("dbtable", String.valueOf(value.getDbtable()), Field.Store.YES, Field.Index.NO));
doc.add(new Field("lucene_pk", lucene_pk, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.setBoost(value.getOrderby());
writer.addDocument(doc);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public static Set<LuceneDB> search(String indexPath, String luceneKey, String word, int maxcount) {
Set<LuceneDB> rst = new HashSet<LuceneDB>();
try {
StringReader reader = new StringReader(word);
File file = new File(indexPath);
Directory dir = FSDirectory.open(file);
IndexSearcher searcher = new IndexSearcher(dir);
Query query = IKQueryParser.parse(luceneKey, word);
TopDocs topDocs = searcher.search(query, maxcount);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
ScoreDoc scoreDoc = scoreDocs[i];
Document targetDoc = searcher.doc(scoreDoc.doc);
LuceneDB db = new LuceneDB();
db.fromDocument(targetDoc, luceneKey);
/*System.out.println(db.getConetnt() + ":");
System.out.println(scoreDoc.score);
System.out.println(searcher.explain(query, scoreDoc.doc));
System.out.println("----------------------");*/
rst.add(db);
}
} catch (Exception e) {
e.printStackTrace();
}
return rst;
}
public static void addIKAnalyzerWord(String... words){
Collection<String> datas = new HashSet<String>();
for(String word:words){
datas.add(word);
}
Dictionary.loadExtendWords(datas);
}
public static void main(String[] args) {
addIKAnalyzerWord("咨","棕");
LuceneDB value = new LuceneDB();
value.setConetnt("你好,请问我的棕子咨询的价格是什么");
value.setPk(1L);
value.setDbtable("records");
value.setOrderby(0.0f);
LuceneDB userValue = new LuceneDB();
userValue.setConetnt("你好,请问我的棕的上来价格是咨什么");
userValue.setPk(2L);
userValue.setDbtable("users");
userValue.setOrderby(0.0f);
LuceneDB userValue2 = new LuceneDB();
userValue2.setConetnt("买棕了要买的上来的方式咨询");
userValue2.setPk(3L);
userValue2.setDbtable("users");
userValue2.setOrderby(0.0f);
LuceneUtils.add("d://index2", "lucene", value);
LuceneUtils.add("d://index2", "lucene", userValue);
LuceneUtils.add("d://index2", "lucene", userValue2);
Set<LuceneDB> rst = LuceneUtils.search("d://index2", "lucene", "咨", 50);
for (LuceneDB luceneDB : rst) {
System.out.println("id:" + luceneDB.getPk() + "," + "table:" + luceneDB.getDbtable() + "," + luceneDB.getConetnt());
}
System.out.println("-------------------------------------");
Set<LuceneDB> rst2 = LuceneUtils.search("d://index2", "lucene", "棕", 50);
for (LuceneDB luceneDB : rst2) {
System.out.println("id:" + luceneDB.getPk() + "," + "table:" + luceneDB.getDbtable() + "," + luceneDB.getConetnt());
}
}
}
package com.sf.module.extension.lucene;
import java.io.Serializable;
import org.apache.lucene.document.Document;
public class LuceneDB {
private Serializable pk;
private String dbtable;
private String conetnt;
private float orderby;
public float getOrderby() {
return orderby;
}
public void setOrderby(float orderby) {
this.orderby = orderby;
}
public Serializable getPk() {
return pk;
}
public void setPk(Serializable pk) {
this.pk = pk;
}
public String getConetnt() {
return conetnt;
}
public void setConetnt(String conetnt) {
this.conetnt = conetnt;
}
public String getDbtable() {
return dbtable;
}
public void setDbtable(String dbtable) {
this.dbtable = dbtable;
}
public LuceneDB fromDocument(Document doc,String luceneKey){
this.pk=doc.get("pk");
this.conetnt=doc.get(luceneKey);
this.dbtable=doc.get("dbtable");
return this;
}
@Override
public boolean equals(Object target) {
LuceneDB obj=(LuceneDB)target;
if(obj.getPk().equals(this.getPk())
&& obj.getDbtable().equals(this.getDbtable())){
return true;
}
return false;
}
@Override
public int hashCode() {
return (this.getPk()+this.getDbtable()).hashCode();
}
}
如何使用Lucene的中文分词搜索
来源:互联网 发布日期:2011-10-05 21:08:05 浏览:26101次
导读:以下文章主要介绍的是如何进行Lucene进行中文分词和全文搜索 package com.sf.module.extension.lucene; import java.io.File; import java.io.Serializable; imp...
相关热词: lucene 中文分词 lucene数据库应用 如何使用
相关内容
AiLab云推荐

最新资讯
- AI.com域名要价1亿美元,目前仍指向DeepSeek
- 马斯克:AI毁灭人类的风险为20%,未来结果更可能“超级棒”
- 大模型“注意力简史”:与两位AI研究者从DeepSeek、Kimi最新改进聊起
- 范先群:在人工智能时代培养更多医工交叉领军人才
- OpenAI推出下一代通用大型语言模型GPT-4.5
- GPT-4.5 重磅发布!OpenAI 最大最贵模型,没把 DeepSeek 当对手
- OpenAI发布最具“情商”的GPT-4.5,奥特曼:已耗尽GPU资源,将在下周增加数万块
- OpenAI推出新模型GPT-4.5,仍面临成本挑战
- 多邻国预测年收入超华尔街预期,人工智能订阅服务将获广泛采用
- OpenAI“高情商”模型GPT-4.5发布,定价高过GPT-4o
本月热点
- DeepSeek风暴席卷AI产业链
- 刷屏的DeepSeek-V3能力到底如何?自称ChatGPT 真相或指向“AI污染”
- 中国大模型“搅动”硅谷,巨头恐慌,大佬发声:中国AI已追上美国
- 北京智源发布2025年AI十大趋势:世界模型有望成多模态大模型下一步
- DeepSeek开源推理大模型R1:纯强化学习实现接近OpenAI o1水平,成本降至1/30
- 人工智能热度再起,AI技术全面渗透是大势所趋
- Transformer作者初创重磅发布Transformer²!AI模型活了,动态调整自己权重
- 每年 CES 都在产生共识,今年的共识是「端侧 AI」
- 2024硅谷AI年度总结:从英伟达到OpenAI,这一年都发生了什么?
- 为超越 OpenAI GPT-4,Meta 不惜使用争议数据训练 Llama 3
热门排行
-
机构看衰、专家批评项目艰难,大语言模型会不会成为即将破碎的AI泡沫?
阅读量:7337
-
人工智能对材料科学研究有哪些深远影响?谢建新院士分享
阅读量:6489
-
这个会议一天提及AI 500次,最后的结论是什么?
阅读量:6287
-
OpenAI 罕见开源!低调发布的新研究,一出来就被碰瓷
阅读量:6061
-
AI攻占诺奖背后:新的技术革命成为社会进步发展的重要引擎
阅读量:5400
-
机构看衰、专家批评项目艰难,大语言模型会不会成为即将破碎的AI泡沫?
阅读量:5300
推荐内容
- 2025年第33届中国华东进出口商品交易会(上海华交会)
- 2025第十五届中国(郑州)塑料产业博览会(AllinPlas)
- 2025第二十届中国(临沂)小商品博览会
- 2025年加拿大多伦多矿业展PDAC
- 2025北方国际电机技术与节能科技展览会
- 2025第三十届届华南国际口腔展览会
- 2025CME第10届上海国际机床展(华机展)
- 2025第14届国际生物发酵展(济南展)(BIO)
- 2025中国(山东)国际工业节能技术与装备博览会
- 2025北方国际膜工业大会暨膜工业技术产品展览会
- 2025第十五届杭州网红直播电商及私域团购选品博览会
- 2025第十五届杭州全球新电商博览会
- 2025济南药交会
- 2025广州国际护肤用品展览会(迎河个护展 PCE)
- 2025第三十一届中国国际包装工业展览会(中国国际包装工业展 Sino-Pack 2025)
- 2025第三十一届华南国际印刷工业展览会(printing south china)
- 第九届广州国际氢科技产业博览会
- 2025第三十二届上海国际广告技术设备展览会(上海国际广印展 APPP EXPO)
- 2025 年日本国际照明LED 展览会