以下文章主要介绍的是如何进行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数据库应用 如何使用
相关内容
- 智源研究院发布2025十大AI技术趋势
- 刘亮:数据已成为人工智能发展基础设施,加快高质量数据共享开放
- AI唱主角的CES 2025:黄仁勋打头阵,落地应用成关键年
- AI风险治理亟需产业实践方案
- 开启全新嵌入式AI领域,意法半导体让STM32惠益更多应用
- 一个大胆的猜测:GPT-5早已存在,只是被OpenAI藏起来了?
- “世界模型”或成AI下一个“必争之地”,英伟达、谷歌双双下场
- DeepSeek-V3或证明Ilya“预训练终结论”有误?UC伯克利博士生证明大模型内容可用于训练新模型
- 不只 5090,英伟达还发布了最小的「AI 超算」与最大的世界模型
- 面壁智能发布多模态大模型MiniCPM-o 2.6,让AI一直“睁着眼”
- 混乱、分裂、吞并:2024年AI的信仰之战
- AI智能体爆发,8亿岗位即将消失!2030年可抢走70%办公室白领饭碗
- AI领先者共话2025:大模型迎来下半场 Agent、机器人成应用爆发点
- 微软开源140亿参数小语言AI模型Phi-4,性能比肩 GPT-4o Mini
- AAAI 2025 | 大模型推理加速新范式:加速比高达3.51倍、成本降至1/3
- 马修·杰克逊:面对AI,没有什么工作是永远安全的
- 视觉模型训练成本一年下降80%,中国AI厂商“掀起”全球算力降价潮
- 在生成式AI时代“抱团取暖”:全球两大视觉内容巨头宣布合并,37亿美元图库巨头或将诞生
- 美媒纳闷:芯片限制下,中国怎么还能在AI领域取得这么大进展?
- 三问“AI 2025”,五款大模型这样说
AiLab云推荐
最新资讯
- 2025, AI进入“飞天”时刻
- 人工智能热度再起,AI技术全面渗透是大势所趋
- 中国人工智能产业规模5年后或超万亿,这两个行业渗透力居首|言叶知新
- 院士专家呼吁加强人工智能科普 培养学生算法意识
- 业界热议AI时代企业合规新趋势 专家:管控借助生成式AI完成的合规质量尤为重要
- AI领先者共话2025:大模型迎来下半场 Agent、机器人成应用爆发点
- 面壁智能发布多模态大模型MiniCPM-o 2.6,让AI一直“睁着眼”
- 美媒:中美人工智能研究合作很活跃
- 一个大胆的猜测:GPT-5早已存在,只是被OpenAI藏起来了?
- AI有泡沫吗?上海交大高金教授蒋展:泡沫是相对的,中国头部AI公司比美国便宜很多
本月热点
热门排行
-
机构看衰、专家批评项目艰难,大语言模型会不会成为即将破碎的AI泡沫?
阅读量:6969
-
大模型落地路线图研究报告:大模型推动“人工智能+”高质量发展
阅读量:6367
-
人工智能对材料科学研究有哪些深远影响?谢建新院士分享
阅读量:6291
-
这个会议一天提及AI 500次,最后的结论是什么?
阅读量:6151
-
OpenAI 罕见开源!低调发布的新研究,一出来就被碰瓷
阅读量:5819
-
机构看衰、专家批评项目艰难,大语言模型会不会成为即将破碎的AI泡沫?
阅读量:5108