以下文章主要介绍的是如何进行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 浏览:25376次
导读:以下文章主要介绍的是如何进行Lucene进行中文分词和全文搜索 package com.sf.module.extension.lucene; import java.io.File; import java.io.Serializable; imp...
相关热词: lucene 中文分词 lucene数据库应用 如何使用
相关内容
AiLab云推荐
最新资讯
本月热点
- 人形机器人崛起:OpenAI、微软洽谈投资Figure AI,望募资5亿美元
- OpenAI 悄悄升级 ChatGPT:可在对话中调用不同的自定义聊天机器人 | 懂点AI
- 麒麟信安入股超能机器人 或尝试打开新业绩增长点?公司最新回应来了
- Limbic开发AI心理咨询机器人,帮用户避免与人类交流可能引发的焦虑感
- 灿瑞科技:已有产品应用于消费级机器人领域
- 英伟达官宣AI聊天机器人,本地RTX显卡运行,这是要挑战OpenAI?
- 人形机器人企业暂时得救了
- Meta联合研发家务机器人,能在零人力帮助下自主整理房间
- 端到端纯视觉!OpenAI押注的人形机器人献艺拜年了
- 波士顿动力 Atlas 机器人能力升级,可灵活搬运汽车零件
热门排行
-
斯坦福家政机器人火了但又翻车了!多数是真人操控编排的
阅读量:163437
-
斯坦福团队发布新机器人Mobile Aloha,人形机器人将迎来产业元年?
阅读量:160742
-
我的同事是 GPT-4 机器人,我们在 Slack 上一起工作
阅读量:156966
-
谷歌起草“机器人宪法”,以确保 AI 机器人不会伤害人类
阅读量:155108
-
人形机器人崛起:OpenAI、微软洽谈投资Figure AI,望募资5亿美元
阅读量:99275
-
大疆回应停售青少年教育产品:将资源聚焦在大学生高校机器人赛事
阅读量:63333
推荐内容
- 2024第二十三届浙江国际智能楼宇技术与智慧安防产品展览会暨浙江(杭州)国际人工智能,物联网,大数据博览会(杭州智博会)
- 2024年中国郑州食品加工及包装机械展
- IOTE 2024第二十一届中国国际物联网博览会(上海站)
- 2024年日本东京IT展Japan IT Week Spring
- 2024越南国际采矿暨设备技术展览会暨2024越南建筑工程展览会
- 2024年第28届土耳其国际电力及能源展览会 土耳其输配电机电工展览会
- 2024年俄罗斯电力电工及电气工程展览会
- 2024年第28届土耳其国际电力及能源展览会
- 2024第三十二届中国国际电子生产设备暨微电子工业展(NEPCON China)
- 2024第十四届中国西部国际物流产业博览会 第八届中国(西安)智慧交通博览会
- 第四届中国国际数字产品博览会
- 2024年俄罗斯第23届国际石油和天然气工业设备及技术展览会
- 2024年法国巴黎国际工程机械展
- 2024石家庄印刷出版博览会
- 2024年第36届俄罗斯国际通信展览会
- 第36届俄罗斯国际通信展(SVIAZ 2024)
- 2024第45届中国(江西)美博会 江西中医养生理疗及大健康博览会
- 2024江苏国际工业自动化及智能装配展览会
- 2024年德国“汉诺威工业博览会”
- 2024年第14届阿曼国际油气能源展
- 2024韩国国际机械展
- 第二届世界细胞与分子生物学大会(CMB 2024)