当前位置:数据库 > mongodb >>

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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,