mongodb全文搜索解决方案(lucene+IKAnalyzer)
mongodb全文搜索解决方案(lucene+IKAnalyzer)
mongodb 解决 全文搜索是个不小的问题
可以用 正则匹配 但是效率很低 往往到大数据量的搜索的时候就会出现 查询超时等现象
当然也可以用官方的做法(在mongodb的文档类型中加字段,存分词结果,
然后从该字段中匹配) 但是我尝试了 效率比原先的好像还要低
www.zzzyk.com
http://www.oschina.net/question/200745_61968
后来我尝试了 lucene+IKAnalyzer 发现效率有所提升啊
原理:lucene 把大文本的数据 利用分词器 在新建的索引文件中建立索引
取数据的时候从索引文件中取
取出mongodb 中的数据进行 索引的创建
01
package sample3;
02
03
import java.io.File;
04
05
import org.apache.lucene.易做图ysis.Analyzer;
06 www.zzzyk.com
import org.apache.lucene.document.Document;
07
import org.apache.lucene.document.Field;
08
import org.apache.lucene.index.IndexWriter;
09
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
10
import org.apache.lucene.store.Directory;
11
import org.apache.lucene.store.FSDirectory;
12
import org.wltea.易做图yzer.lucene.IKAnalyzer;
13
14
import com.mongodb.DB;
15
import com.mongodb.DBCollection;
16
import com.mongodb.DBCursor;
17
import com.mongodb.Mongo;
18
19
/**
20
* 创建索引
21
* <a href="http://my.oschina.net/arthor" class="referer" target="_blank">@author</a> zhanghaijun www.zzzyk.com
22
*
23
*/
24
public class Demo1 {
25
public static void main(String[] args) throws Exception {
26
//先在数据库中拿到要创建索引的数据
27
Mongo mongo = new Mongo();
28
DB db = mongo.getDB("zhang");
29
DBCollection msg = db.getCollection("test3");
30
DBCursor cursor = msg.find();
31
//是否重新创建索引文件,false:在原有的基础上追加
32
boolean create = true;
33
//创建索引
34
Directory directory = FSDirectory.open(new File("E:\\lucene\\index"));
35 www.zzzyk.com
Analyzer 易做图yzer = new IKAnalyzer();//IK中文分词器
36
IndexWriter indexWriter = new IndexWriter(directory,易做图yzer,MaxFieldLength.LIMITED);
37
boolean exist = cursor.hasNext();
38
while(exist){
39
//System.out.println(cursor.next().get("text").toString());
40
Document doc = new Document();
41
Field fieldText = new Field("text",cursor.next().get("text").toString(),Field.Store.YES,
42
Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
43
doc.add(fieldText);
44
indexWriter.addDocument(doc);
45
exist = cursor.hasNext();
46
}
47
cursor = null;
48
//optimize()方法是对索引进行优化
49
indexWriter.optimize();
50
//最后关闭索引
51
indexWriter.close();
52 www.zzzyk.com
}
53
}
数据的查找(直接从索引文件中查找)
01
package sample3;
02
03
import java.io.File;
04
05
import org.apache.lucene.document.Document;
06
import org.apache.lucene.index.IndexReader;
07
import org.apache.lucene.search.IndexSearcher;
08
import org.apache.lucene.search.Query;
09
import org.apache.lucene.search.ScoreDoc;
10
import org.apache.lucene.search.TopDocs;
11
import org.apache.lucene.store.FSDirectory;
12
import org.wltea.易做图yzer.lucene.IKAnalyzer;
13
import org.wltea.易做图yzer.lucene.IKQueryParser;
14
import org.wltea.易做图yzer.lucene.IKSimilarity;
15 www.zzzyk.com
16
/**
17
* 查找索引
18
*/
19
public class Demo2 {
20
public static void main(String[] args) throws Exception {
21
// onlysearching, so read-only=true
22
long starttime = System.currentTimeMillis();
23
IndexReader reader =IndexReader.open(FSDirectory.open(new File("E:\\lucene\\index")),true);
24
IndexSearcher searcher = new IndexSearcher(reader);
25
searcher.setSimilarity(new IKSimilarity()); //在索引器中使用IKSimilarity相似度评估器
26
//String[] keys = {"4","testtest"}; //关键字数组
27
//String[] fields = {"id","title"}; //搜索的字段
28
//BooleanClause.Occur[] flags = {BooleanClause.Occur.MUST,BooleanClause.Occur.MUST}; //BooleanClause.Occur[]数组,它表示多个条件之间的关系 www.zzzyk.com
29
//使用 IKQueryParser类提供的parseMultiField方法构建多字段多条件查询
30
//Query query = IKQueryParser.parseMultiField(fields,keys, flags); //IKQueryParser多个字段搜索
31
Query query =IKQueryParser.parse("text","上海人"); //IK搜索单个字段
32
IKAnalyzer 易做图yzer = new IKAnalyzer();
33
//Query query =MultiFieldQueryParser.parse(Version.LUCENE_CURRENT, keys, fields, flags,易做图yzer); //用MultiFieldQueryParser得到query对象
34
&n
上一个:数据库基础之“索引”
下一个:dblink连接数据库clob字段的异常处理
- 更多mongodb疑问解答:
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类
- java操作mongodb
- Spring data MongoDB 更新整个内嵌文档时报错???????
- node.js连接mongodb更新
- MongoDB Java驱动 WriteConcern.SAFE非常浪费资源
- 求科普,hibernate怎样操作mongodb?
- 问一下mongodb怎么用hibernate整合
- mongodb查询的数据过多
- 使用JAVA创建MongoDB的问题
- Mongodb事务管理问题?
- mongodb利用java进行模糊查询
- spring 抽象类 注入值为空(spring3+mongodb+morphia)
- 【急】MongoDB写入错误~~~~
- Mongodb NOSql 数据库问题,是否可以插入带接口的类