2013-01-11 16 views

回答

1

我在這花了很長時間,因爲我對Mongo DB是如此的陌生,並沒有計劃使用它,直到它看起來像Heroku上的搜索實現的一個很好的解決方案。我想我會添加這個答案來幫助任何想要做同樣事情的人。

我使用的代碼從設在這裏了Lucene蒙戈DB項目:

https://github.com/mongoutils/mongo-lucene

然後創建了以Lucene的蒙戈DB接口的項目我自己的Hibernate Search的目錄提供類。我使用org.hibernate.search.store.impl.RAMDirectoryProvider類作爲大綱。

所有這就是剩下要做的就是讓你的Hibernate配置指向你的新類:

hibernate.search.default.directory_provider=com.foo.MongoLuceneDirectoryProvider 

這裏是我MongoLuceneDirectoryProvider類:

package com.foo.MongoLuceneDirectoryProvider 

import java.io.IOException; 
import java.net.UnknownHostException; 
import java.util.Properties; 
import java.util.concurrent.ConcurrentMap; 

import org.apache.log4j.Logger; 
import org.apache.lucene.store.Directory; 
import org.hibernate.search.SearchException; 
import org.hibernate.search.indexes.impl.DirectoryBasedIndexManager; 
import org.hibernate.search.spi.BuildContext; 
import org.hibernate.search.store.DirectoryProvider; 
import org.hibernate.search.store.impl.DirectoryProviderHelper; 

import com.github.mongoutils.collections.DBObjectSerializer; 
import com.github.mongoutils.collections.MongoConcurrentMap; 
import com.github.mongoutils.collections.SimpleFieldDBObjectSerializer; 
import com.github.mongoutils.lucene.MapDirectory; 
import com.github.mongoutils.lucene.MapDirectoryEntry; 
import com.github.mongoutils.lucene.MapDirectoryEntrySerializer; 
import com.mongodb.DB; 
import com.mongodb.DBCollection; 
import com.mongodb.Mongo; 
import com.mongodb.MongoException; 

public class MongoLuceneDirectoryProvider implements DirectoryProvider<Directory> { 

    private Logger log = Logger.getLogger(MongoLuceneDirectoryProvider.class); 

    private Directory directory; 

    private String indexName; 
    private Properties properties; 

    @Override 
    public void initialize(String directoryProviderName, Properties properties, BuildContext context) { 

      indexName = directoryProviderName; 
     this.properties = properties; 

     Mongo mongo; 

     try { 
      mongo = new Mongo("localhost"); 

      DB db = mongo.getDB("testdb"); 
      DBCollection dbCollection = db.getCollection("testcollection"); 

      DBObjectSerializer<String> keySerializer = new SimpleFieldDBObjectSerializer<String>("key"); 
      DBObjectSerializer<MapDirectoryEntry> valueSerializer = new MapDirectoryEntrySerializer("value"); 
      ConcurrentMap<String, MapDirectoryEntry> store = new MongoConcurrentMap<String, MapDirectoryEntry>(dbCollection, keySerializer, valueSerializer); 

      directory = new MapDirectory(store); 
     } 
     catch (UnknownHostException e) { 
      log.error("While attempting to initalize Mongo directory provider", e); 
     } 
     catch (MongoException e) { 
      log.error("While attempting to initalize Mongo directory provider", e); 
     } 
     catch (IOException e) { 
      log.error("While attempting to initalize Mongo directory provider", e); 
     } 
    } 

    @Override 
    public void start(DirectoryBasedIndexManager indexManager) { 

     try { 
      directory.setLockFactory(DirectoryProviderHelper.createLockFactory(null, properties)); 
      properties = null; 
      DirectoryProviderHelper.initializeIndexIfNeeded(directory); 
     } 
     catch (IOException e) { 
      throw new SearchException("Unable to initialize index: " + indexName, e); 
     } 
    } 

    @Override 
    public void stop() { 

     try { 
      directory.close(); 
     } 
     catch (IOException e) { 
      log.error("While attempting to stop directory provider", e); 
     } 
    } 

    @Override 
    public Directory getDirectory() { return this.directory; } 

} 
相關問題